不明TLE求调
查看原帖
不明TLE求调
222865
迟暮天复明心華楼主2024/4/18 22:53

做法不是题解做法,似乎常数略大,但是感觉不至于 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;
}
2024/4/18 22:53
加载中...