社区讨论
P8575 「DTOI-2」星之河 求调
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lzzm5dhg
- 此快照首次捕获于
- 2024/08/18 21:39 2 年前
- 此快照最后确认于
- 2024/08/19 09:46 2 年前
这是一道CDQ
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=200007;
int n,f[MAXN];
int ee[MAXN<<1],h[MAXN<<1],hd[MAXN<<1],cnt;
struct node{
int a,b,dfn;
int id;
}e[MAXN];
int tot,ans[MAXN];
void add(int a,int b){
ee[++cnt]=b;
hd[cnt]=h[a];
h[a]=cnt;
}
void dfs(int rt,int fa){
e[rt].dfn=++tot;
f[rt]=1;
for(int i=h[rt];i;i=hd[i]){
if(ee[i]==fa) continue;
dfs(ee[i],rt);
f[rt]+=f[ee[i]];
}
}
bool cmp(node x,node y){
return x.a<y.a;
}
bool Cmp(node x,node y){
return x.b<y.b;
}
int tree[MAXN];
void modify(int x,int c){
for(;x<=n;x+=(x&-x)) tree[x]+=c;
}
int query(int x){
int res=0;
for(;x;x-=(x&-x)) res+=tree[x];
return res;
}
void Cdq(int l,int r){
if(l==r) return ;
int mid=(l+r)>>1;
Cdq(l,mid);
Cdq(mid+1,r);
sort(e+l,e+1+mid,Cmp);
sort(e+mid+1,e+1+r,Cmp);
int j=l;
for(int i=mid+1;i<=r;i++){
while(j<=mid and e[i].b>=e[j].b){
modify(e[j].dfn,1);
j++;
}
ans[e[i].id]+=query(e[i].dfn+f[e[i].id]-1)-query(e[i].dfn);
}
for(int i=l;i<j;i++) modify(e[i].dfn,-1);
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<n;i++){
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y);
add(y,x);
}
dfs(1,-1);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&e[i].a,&e[i].b);
e[i].id=i;
}
sort(e+1,e+1+n,cmp);
Cdq(1,n);
for(int i=1;i<=n;i++){
if(ans[i]) printf("%lld\n",ans[i]);
}
return 0;
}
请好人帮忙调一下
回复
共 0 条回复,欢迎继续交流。
正在加载回复...