做法不是题解做法,似乎常数略大,但是感觉不至于 1e6 都过不去。想知道发生了什么
#include<bits/stdc++.h>
using namespace std;
///#define int long long
int tree[4000010],lazy[4000010];
void build(int p,int l,int r){
if(l==r){tree[p]=l;return;}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
tree[p]=r;
}
void pushdown(int p){
int l=p<<1,r=p<<1|1;
tree[l]+=lazy[p],tree[r]+=lazy[p];
lazy[l]+=lazy[p],lazy[r]+=lazy[p];
lazy[p]=0;
}
void pushup(int p){
int l=p<<1,r=p<<1|1;
tree[p]=max(tree[p<<1],tree[p<<1|1]);
}
void update(int p,int l,int r,int x,int y,int k){
if(l>=x&&r<=y){
tree[p]+=k,lazy[p]+=k;
return;
}
pushdown(p);
int mid=l+r>>1;
if(mid>=x)update(p<<1,l,mid,x,y,k);
if(mid<y)update(p<<1|1,mid+1,r,x,y,k);
pushup(p);
}
int query(int p,int l,int r,int x,int y){
if(l>=x&&r<=y)return tree[p];
pushdown(p);
int mid=l+r>>1,ans=-1e9;
if(mid>=x)ans=max(ans,query(p<<1,l,mid,x,y));
if(mid<y)ans=max(ans,query(p<<1|1,mid+1,r,x,y));
return ans;
}
vector<int>e[1000010];
int state[1000010],dis[1000010],vis[1000010],sum,maxdis;
multiset<int>S;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,m,k,t;cin>>n>>m>>k>>t;
for(int i=1;i<=m;++i){
int u,v;cin>>u>>v;
e[v].push_back(u);
}
queue<int>q;q.push(t);
memset(dis,0x3f,sizeof(dis));dis[t]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i:e[u])if(dis[i]>dis[u]+1){
dis[i]=dis[u]+1;
if(!vis[i])q.push(i),vis[i]=1;
}
}
for(int i=1;i<=n;++i)maxdis=max(maxdis,dis[i]);
//cout<<maxdis<<endl;
build(1,1,maxdis);
while(k--){
int u;cin>>u;
if(state[u]){
update(1,1,maxdis,dis[u],maxdis,1),--sum;
S.erase(S.find(dis[u]));
}
else update(1,1,maxdis,dis[u],maxdis,-1),++sum,S.insert(dis[u]);
state[u]=!state[u];
//cout<<*S.rbegin()<<' '<<dis[u]<<'\n';
cout<<sum+query(1,1,maxdis,1,*S.rbegin())<<'\n';
}
return 0;
}