UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#214602#2376. 树与异或Super_Leo66601045ms112460kbC++113.3kb2024-11-20 20:02:252024-11-20 23:04:01

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,MOD=1e9+7;
int n,m,x,y;
int head[N],tot,v[N];
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
	return x*f;
}
void write(int x){
	if(x<0) x=-x,putchar('-');
	if(x>=10) write(x/10);
	putchar(x%10+'0');
}
vector<int> G[N];
int vis[N],D_fa[N],SZ,MX,sz[N],r;
int dep[N],f[N][25],a[N];
void dfs(int u,int fa){
    dep[u]=dep[fa]+1; f[u][0]=fa;
    for(int i=1;i<=21;i++) f[u][i]=f[f[u][i-1]][i-1];
    for(int v:G[u]){
        if(v==fa) continue;
        dfs(v,u);
    }
}
int cnt,p[N];
void findrt(int u,int fa){
    sz[u]=1;p[++cnt]=u;
    int mx=0;
    for(int v:G[u]){
        if(v==fa||vis[v]) continue;
        findrt(v,u);
        sz[u]+=sz[v];
        mx=max(mx,sz[v]);
    }
    mx=max(mx,SZ-sz[u]);
    if(mx<MX) MX=mx,r=u;
}

template<typename TT>
class BIT{
	vector<int> T;
	int lowbit(int x){
		return x&-x;
	}
public:
    void build(int x){
        for(int i=0;i<=x+2;i++)
			T.push_back(0);
    }
    void add(int x,int y){
        for(int i=x;i<T.size();i+=lowbit(i))
            T[i]^=y;
    }
    int query(int x){
        int res=0;
        x=min(x,(int)T.size()-1);
        for(int i=x;i;i-=lowbit(i))
            res^=T[i];
        return res;
    }
};
BIT<int> S1[N],S2[N];
int LCA(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=21;~i;i--)
    	if(dep[f[x][i]]>=dep[y])
            x=f[x][i];
    if(x==y) return x;
    for(int i=21;~i;i--)
        if(f[x][i]!=f[y][i])
            x=f[x][i],y=f[y][i];
    return f[x][0];
}
int getdis(int x,int y){
    return dep[x]+dep[y]-2*dep[LCA(x,y)];
}
void dfs2(int r,int u,int fa,int DEP){
    S1[r].add(DEP,a[u]);
    for(int v:G[u]){
        if(v==fa||vis[v]) continue;
        dfs2(r,v,u,DEP+1);
    }
}
void solve(int u,int fa){
    vis[u]=1;D_fa[u]=fa;
    S2[u].build(cnt);
    if(fa)
        for(int i=1;i<=cnt;i++)
            S2[u].add(getdis(p[i],fa),a[p[i]]);
    S1[u].build(cnt);
    for(int v:G[u]){
        if(vis[v]) continue;
        dfs2(u,v,u,1);
    }
    for(int v:G[u]){
        if(vis[v]) continue;
        SZ=MX=sz[v],r=cnt=0;
        findrt(v,0),solve(r,u);
    }
}
int query(int x,int k){
    int res=0,u=x;
    res=res^S1[x].query(k)^a[x];
    while(D_fa[u]){
        int d=getdis(x,D_fa[u]);
        if(d<=k) res=res^a[D_fa[u]]^S1[D_fa[u]].query(k-d)^S2[u].query(k-d);
        u=D_fa[u];
    }
    return res;
}
void update(int x,int y){
    int u=x;
	while(D_fa[u]){
        int d=getdis(x,D_fa[u]);
        S2[u].add(d,a[x]),S2[u].add(d,y);
        u=D_fa[u];
        S1[u].add(d,a[x]),S1[u].add(d,y);
    }
    a[x]=y;
}
signed main(){
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=1;i<n;i++){
        x=read(),y=read();
        G[x].push_back(y);
        G[y].push_back(x);
    }
    dfs(1,0);
    SZ=MX=n,cnt=0;
    findrt(1,0),solve(r,0);
    int res=0;
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        update(x,y);
        res=(res+query(x,2)*i%MOD*i%MOD)%MOD;
    }
    write(res),puts("");
    return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 21ms
memory: 71968kb

input:

1000 994
780089107 4670366 871010085 73730768 526852049 572589363 885190993 1049357301 450850404 460...

output:

503748432

result:

ok 1 number(s): "503748432"

Test #2:

score: 10
Accepted
time: 15ms
memory: 71964kb

input:

1000 999
26885995 181771373 378079250 245122183 660787775 479226046 575400611 257120086 214404794 48...

output:

301019013

result:

ok 1 number(s): "301019013"

Test #3:

score: 10
Accepted
time: 8ms
memory: 71964kb

input:

1000 994
978408146 31636243 945016735 512129400 92881624 689719983 649699545 964802847 100094796 941...

output:

250985726

result:

ok 1 number(s): "250985726"

Test #4:

score: 10
Accepted
time: 339ms
memory: 112460kb

input:

100000 99994
194640838 777315353 114710204 754050649 372592717 210279787 542056883 638262010 7998293...

output:

897014293

result:

ok 1 number(s): "897014293"

Test #5:

score: 10
Accepted
time: 318ms
memory: 112456kb

input:

100000 100000
458877901 215980825 777376132 863774865 34430451 828397116 94813690 931300514 10548367...

output:

351450518

result:

ok 1 number(s): "351450518"

Test #6:

score: 10
Accepted
time: 344ms
memory: 112456kb

input:

100000 99991
56406146 757409402 876799234 573444553 883023109 326033134 328116703 623771278 41269529...

output:

440189625

result:

ok 1 number(s): "440189625"

Test #7:

score: 0
Time Limit Exceeded

input:

1000000 999998
814298729 663807029 628693441 45635199 148428014 913833778 1034283337 600802841 58045...

output:


result:


Test #8:

score: 0
Time Limit Exceeded

input:

1000000 999993
112899321 425466951 471078924 857561298 449437156 710041336 1033281580 23390934 44420...

output:


result:


Test #9:

score: 0
Time Limit Exceeded

input:

1000000 1000000
273043260 1042513348 30746190 864557483 187812119 562837674 263192174 364182254 3537...

output:


result:


Test #10:

score: 0
Time Limit Exceeded

input:

1000000 999995
83067658 1064735371 623243759 757522311 539363923 924297206 75317137 543750195 822898...

output:


result: