社区讨论
WA on #6~#11 求调
P1600[NOIP 2016 提高组] 天天爱跑步参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi7j8pqe
- 此快照首次捕获于
- 2025/11/20 22:34 3 个月前
- 此快照最后确认于
- 2025/11/21 11:51 3 个月前
CPP
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<map>
#include<iomanip>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<bitset>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<cassert>
#include<cctype>
#include<cstdlib>
#include<ctime>
#include<random>
#define _for(i,a,b) for(signed i=(a);i<=(b);i++)
#define _rof(i,a,b) for(signed i=(a);i>=(b);i--)
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define memset0(a) memset(a,0,sizeof(a))
#define memset127(a) memset(a,127,sizeof(a))
#define ft first
#define sd second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
inline int read(){
int num=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<1)+(num<<3)+(c^48);c=getchar();}
return num*f;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
int n=read(),m=read();
vector<int> edge[300005];
int fa[20][300005];
int dfn[300005],cnt,dep[300005];
int w[300005];
int cnt1[900005],cnt2[900005];
vector<pii> s[300005],t[300005];
int ans[300005];
inline int g(int x,int y){return dfn[x]<dfn[y]?x:y;}
inline void dfs1(int x,int from){
fa[0][dfn[x]=++cnt]=from;
for(int y:edge[x]) if(y!=from){
dep[y]=dep[x]+1;
dfs1(y,x);
}
}
inline int lca(int x,int y){
if(x==y) return x;
x=dfn[x],y=dfn[y];
if(x>y) swap(x,y);
int d=__lg(y-x++);
return g(fa[d][x],fa[d][y-(1<<d)+1]);
}
inline void dfs2(int x,int from){
int p1=cnt1[w[x]+dep[x]+n],p2=cnt2[w[x]-dep[x]+n];
for(auto i:s[x]){
if(i.sd==0) cnt1[i.ft]++;
else cnt2[i.ft]++;
}
for(auto i:t[x]){
if(i.sd==0) cnt1[i.ft]--;
else cnt2[i.ft]--;
}
for(int y:edge[x]) if(y!=from){
dfs2(y,x);
}
ans[x]=cnt1[w[x]+dep[x]+n]-p1+cnt2[w[x]-dep[x]+n]-p2;
}
signed main(){
_for(i,1,n-1){
int x=read(),y=read();
edge[x].push_back(y);
edge[y].push_back(x);
}
dfs1(1,0);
int d=__lg(n);
_for(i,1,d) _for(j,1,n-(1<<i)){
fa[i][j]=g(fa[i-1][j],fa[i-1][j+(1<<i-1)]);
}
_for(i,1,n) w[i]=read();
_for(i,1,m){
int x=read(),y=read();
int l=lca(x,y);
s[x].push_back({dep[x]+n,0}),s[y].push_back({dep[x]-2*dep[l]+n,1});
t[fa[0][dfn[l]]].push_back({dep[x]+n,0}),t[l].push_back({dep[x]-2*dep[l]+n,1});
}
dfs2(1,0);
_for(i,1,n) printf("%d ",ans[i]);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...