Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
31959 | LYLAKIOI | 【S】T3 | C++ | 解答错误 | 0 | 763 MS | 75512 KB | 2567 | 2024-08-28 15:43:16 |
#include<bits/stdc++.h> #define Rf(i,a,b) for(int i=(a);i<=(b);i++) #define Rb(i,a,b) for(int i=(a);i>=(b);i--) #define jp8 push_back using namespace std; const int N=5e5+10; struct nd{ int id,vl; bool operator<(const nd &b)const{ return vl<b.vl; } }; vector<int> e[N],d[N]; int siz[N],mx[N],g[N],p[N],idx[N],val[N],fa[N]; bool vis[N];set<int> q,r;priority_queue<nd> ds; int n,m; void dfs(int u){ vis[u]=1;siz[u]=1,mx[u]=idx[u]; int it=0,sz=d[u].size()-1; for(auto v:e[u]){ while(it<=sz){ if(d[u][it]<v) it++; else break; }if(it<=sz)if(v==d[u][it]){ it++;continue; }if(vis[v]) continue; fa[v]=u; dfs(v);siz[u]+=siz[v];mx[u]=max(mx[u],mx[v]); } } void solve(){ Rf(i,1,n) vis[i]=0,siz[i]=0,mx[i]=0,val[i]=0,fa[i]=0;mx[0]=n+1; dfs(1); q.clear();//r.clear(); //Rf(i,1,n) cout<<siz[i]<<' '<<mx[i]<<' '<<idx[i]<<endl; //Rf(i,1,n) Rf(i,1,n) q.insert(i);//while(!ds.empty()) ds.pop(); //Rf(i,1,n) ds.push((nd){i,siz[i]}); long long ans=0; Rf(i,1,n){ //nd now=ds.top();ds.pop(); int now=i; int pl=idx[now];int pr=mx[now]-1; int tmp=pl; while(tmp<=pr){ auto it=q.lower_bound(tmp); if(it==q.end()) break; tmp=*it;if(tmp>pr) break;q.erase(tmp); } /*pl=idx[now.id],pr=mx[now.id]-1;tmp=pl; while(tmp<=pr){ auto it=r.lower_bound(tmp); if(it==r.end()) break; tmp=*it;r.erase(tmp); } pl=mx[now.id],pr=n;tmp=pl; while(tmp<=pr){ auto it=q.lower_bound(tmp); if(it==q.end()) break; tmp=*it;val[tmp]=now.vl;r.insert(tmp);q.erase(tmp); }*/ val[mx[now]]++;val[mx[fa[now]]]--; }Rf(i,1,n){ val[i]+=val[i-1]; //ans+=val[i]; //cout<<val[i]<<' '; }for(auto ed:q){ //cout<<ed<<' '; ans+=val[ed]; }cout<<ans<<endl; }void slv(){ cin>>n>>m;m=1; Rf(i,1,n-1){ int u,v;cin>>u>>v; e[u].jp8(v);e[v].jp8(u); }Rf(i,1,n){ cin>>p[i];idx[p[i]]=i; } while(m--){ int u,v,x,y;cin>>u>>v>>x>>y; d[u].jp8(v);d[v].jp8(u);e[x].jp8(y);e[y].jp8(x); Rf(i,1,n) sort(e[i].begin(),e[i].end()),sort(d[i].begin(),d[i].end()); solve(); } } int main(){ //freopen("bird.in","r",stdin);freopen("bird.out","w",stdout); slv(); return 0; }