社区讨论

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 条回复,欢迎继续交流。

正在加载回复...