P7508 「Wdsr-2-5」第二次月面战争
posted on 2024-06-09 12:34:33 | under | source
贪心地想,肯定是让每个点走最短路,不妨记为 \(dist_i\),但是会出现冲突。
结论:若 \(dist_x\ne dist_y\),则一定不会冲突,反之一定冲突。
倒推可证。
那么考虑逐个插入 \(dist_i\),若已有 \(dist_j=dist_i\),那就让 \(dist_i\) 增加直到没有相同的即可。
不过这个东西不太好维护的亚子,注意到:若将所有 \(dist_i\) 从大到小给予排名 \(rk_i\),那么要求的最大值就是 \(\max dist_i+rk_i-1\)。
其实等价于假设 \(>dist_i\) 的元素构成一段连续区间,算出来让它排在这个区间右端点的右边。就算实际上并不构成一段连续的区间,也不会导致答案变大。所以是对的。
那么值域线段树维护即可。
代码
写的比较史。
#include<bits/stdc++.h>
using namespace std;
const int N = 1.05e6 + 5;
int n, m, k, _t, u, v, dis[N], x;
int flag[N], buc[N];
vector<int> to[N];
queue<int> q;
set<int> s;
inline int read() { int x = 0, w = 0; char ch = 0; while (!isdigit(ch)) {w |= ch == '-'; ch = getchar();} while (isdigit(ch)) {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();} return w ? -x : x; }
inline void write(int x) { if (x < 0) putchar('-'), x = -x; if (x > 9) write(x / 10); putchar(x % 10 + '0'); }
namespace Sg_Tree{
#define lt (u << 1)
#define rt (u << 1 | 1)
#define mid (l + r >> 1)
int t[N << 2], tag[N << 2];
inline void psup(int u) {t[u] = max(t[lt], t[rt]);}
inline void psdw(int u) {t[lt] += tag[u], t[rt] += tag[u], tag[lt] += tag[u], tag[rt] += tag[u], tag[u] = 0;}
inline void build(int u, int l, int r){
if(l == r) {t[u] = l; return ;}
build(lt, l, mid), build(rt, mid + 1, r);
psup(u);
}
inline void upd(int u, int l, int r, int ll, int rr, int p){
if(ll <= l && r <= rr) {t[u] += p, tag[u] += p; return ;}
psdw(u);
if(ll <= mid) upd(lt, l, mid, ll, rr, p);
if(rr > mid) upd(rt, mid + 1, r, ll, rr, p);
psup(u);
}
inline int fid(int u, int l, int r, int ll, int rr){
if(ll > rr) return 0;
if(ll <= l && r <= rr) return t[u];
psdw(u); int res = 0;
if(ll <= mid) res = max(res, fid(lt, l, mid, ll, rr));
if(rr > mid) res = max(res, fid(rt, mid + 1, r, ll, rr));
psup(u); return res;
}
}using namespace Sg_Tree;
int main(){
cin >> n >> m >> k >> _t;
for(int i = 1; i <= m; ++i) u = read(), v = read(), to[v].push_back(u);
dis[_t] = 1, q.push(_t);
while(!q.empty()){
int u = q.front(); q.pop();
for(auto v : to[u])
if(!dis[v]) dis[v] = dis[u] + 1, q.push(v);
}
++m;
build(1, 1, m);
while(k--){
x = read();
if(!flag[x]){
flag[x] = 1, upd(1, 1, m, 1, dis[x], 1);
if((++buc[dis[x]] == 1)) s.insert(dis[x]);
}
else{
flag[x] = 0, upd(1, 1, m, 1, dis[x], -1);
if((--buc[dis[x]]) == 0) s.erase(dis[x]);
}
write(max(fid(1, 1, m, 1, *s.rbegin()) - 1, 0));
putchar('\n');
}
return 0;
}

浙公网安备 33010602011771号