Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32164 | liuziming | 【S】T3 | C++ | 运行超时 | 0 | 5000 MS | 49180 KB | 4522 | 2024-09-05 20:51:38 |
#include<bits/stdc++.h> using namespace std; int n,m,ans[500010<<4]; int limx[500010],limy[500010],p[500010],sum[500010],t[500010]; struct node{ int val; int attribute; int lazytag_atb; int lazytag_val; int cnt; }Segtree[500100<<4]; inline int ls(int x){return x<<1;} inline int rs(int x){return x<<1|1;} inline void update(int x){ if(Segtree[ls(x)].attribute<Segtree[rs(x)].attribute){ Segtree[x].cnt=Segtree[ls(x)].cnt; Segtree[x].val=Segtree[ls(x)].val; Segtree[x].attribute=Segtree[ls(x)].attribute; }else{ if(Segtree[ls(x)].attribute>Segtree[rs(x)].attribute){ Segtree[x].cnt=Segtree[rs(x)].cnt; Segtree[x].val=Segtree[rs(x)].val; Segtree[x].attribute=Segtree[rs(x)].attribute; }else{ Segtree[x].cnt=Segtree[ls(x)].cnt+Segtree[rs(x)].cnt; Segtree[x].val=Segtree[rs(x)].val+Segtree[ls(x)].val; Segtree[x].attribute=Segtree[rs(x)].attribute; } }return; }inline void build(int x,int l,int r){ //update(x); if(l==r){ Segtree[x].attribute=n-l; Segtree[x].cnt=1; return; }int mid=(l+r)>>1; build(ls(x),l,mid); build(rs(x),mid+1,r); update(x); }inline void downsend(int x,int l,int r){ Segtree[ls(x)].attribute+=Segtree[x].lazytag_atb; Segtree[rs(x)].attribute+=Segtree[x].lazytag_atb; Segtree[ls(x)].lazytag_atb+=Segtree[x].lazytag_atb; Segtree[rs(x)].lazytag_atb+=Segtree[x].lazytag_atb; Segtree[x].lazytag_atb=0; int mid=(l+r)>>1; Segtree[ls(x)].val+=Segtree[x].lazytag_val*Segtree[ls(x)].cnt; Segtree[rs(x)].val+=Segtree[x].lazytag_val*Segtree[rs(x)].cnt; Segtree[ls(x)].lazytag_val+=Segtree[x].lazytag_val; Segtree[rs(x)].lazytag_val+=Segtree[x].lazytag_val; Segtree[x].lazytag_val=0; }inline void ADD_attribute(int x,int l,int r,int aiml,int aimr,int num){ downsend(x,l,r); if(aiml<=l&&r<=aimr){ Segtree[x].attribute+=num; Segtree[x].lazytag_atb+=num; return; }int mid=(l+r)>>1; if(aiml<=mid) ADD_attribute(ls(x),l,mid,aiml,aimr,num); if(aimr>mid) ADD_attribute(rs(x),mid+1,r,aiml,aimr,num); update(x); }inline void ADD_val(int x,int l,int r,int aiml,int aimr,int num){ downsend(x,l,r); if(aiml<=l&&r<=aimr){ Segtree[x].val+=num*Segtree[x].cnt; Segtree[x].lazytag_val+=num; return; }int mid=(l+r)>>1; if(aiml<=mid) ADD_val(ls(x),l,mid,aiml,aimr,num); if(aimr>mid) ADD_val(rs(x),mid+1,r,aiml,aimr,num); update(x); }inline void get_attribute(int x,int l,int r,int aiml,int aimr){ downsend(x,l,r); if(aiml<=l&&r<=aimr){ cout<<Segtree[x].attribute<<' '; return; }int mid=(l+r)>>1; if(aiml<=mid) get_attribute(ls(x),l,mid,aiml,aimr); if(aimr>mid) get_attribute(rs(x),mid+1,r,aiml,aimr); update(x); }int main(){ //freopen("code.in","r",stdin); ios::sync_with_stdio(0); cin>>n>>m; //cout<<n<<' '<<m<<'\n'; for(int i=1;i<=n-1;i++){ cin>>limx[i]>>limy[i]; //cout<<limx[i]<<' '<<limy[i]<<'\n'; }for(int i=1;i<=n-1;i++){ cin>>p[i]; }p[n]=1; for(int i=1;i<=n;i++){ t[p[i]]=i; }build(1,1,n-1); // for(int i=1;i<=n-1;i++){ // cout<<t[i]<<' '; // }cout<<'\n'; for(int i=1;i<=n-1;i++){ //cout<<t[limx[i]]<<' '<<t[limy[i]]<<'\n'; if(t[limx[i]]>=t[limy[i]]){ swap(limx[i],limy[i]); }if(t[limx[i]]>1) ADD_attribute(1,1,n-1,1,t[limx[i]]-1,-1); if(t[limx[i]]<t[limy[i]]) ADD_val(1,1,n-1,t[limx[i]],t[limy[i]]-1,1); //if(t[limy[i]]<n) ADD_attribute(1,1,n-1,t[limy[i]],n-1,1); }cout<<Segtree[1].val<<'\n'; while(m--){ // for(int i=1;i<=n-1;i++){ // get_attribute(1,1,n-1,i,i); // }cout<<'\n'; int u,v; cin>>u>>v; if(t[u]>=t[v]){ swap(u,v); }if(t[u]>1) ADD_attribute(1,1,n-1,1,t[u]-1,1); if(t[u]<t[v]) ADD_val(1,1,n-1,t[u],t[v]-1,-1); //ADD_attribute(1,1,n-1,t[v],n-1,-1); cin>>u>>v; if(t[u]>=t[v]){ swap(u,v); }if(t[u]>1) ADD_attribute(1,1,n-1,1,t[u]-1,-1); if(t[u]<t[v]) ADD_val(1,1,n-1,t[u],t[v]-1,1); //ADD_attribute(1,1,n-1,t[v],n-1,1); cout<<Segtree[1].val<<'\n'; // for(int i=2;i<=(n<<1);i++){ // cout<<Segtree[i].val<<' '<<Segtree[i].attribute<<'\n'; // } } }