zsh_haha @ 2023-12-09 21:32:11
原因:死循环
#include<bits/stdc++.h>
using namespace std;
struct node{
long long v,ne;
}e[200005];
long long h[100005],cnt;
void add(long long u,long long v){
e[++cnt].ne=h[u];
h[u]=cnt;
e[cnt].v=v;
}
long long n,m,r,p;
long long w[100005];
long long dep[100005],fa[100005],son[100005],wss[100005];
void dfs1(long long depp,long long fat,long long x){
dep[x]=depp;
fa[x]=fat;
son[x]=1;
for(long long i=h[x];i;i=e[i].ne){
long long v=e[i].v;
if(v!=fat){
dfs1(depp+1,x,v);
son[x]+=son[v];
if(son[wss[x]]<=son[v]){
wss[x]=v;
}
}
}
}
long long num[100005],wt[100005],top[100005];
void dfs2(long long topp,long long x){
top[x]=topp;
num[x]=++cnt;
wt[cnt]=w[x];
if(wss[x]==0){
return;
}
dfs2(topp,wss[x]);
for(long long i=h[x];i;i=e[i].ne){
long long v=e[i].v;
if(v!=fa[x]&&v!=wss[x]){
dfs2(v,v);
}
}
}
struct nod{
long long l,r,val,tag;
}tr[800005];
void build(long long root,long long l,long long r){
tr[root].l=l;
tr[root].r=r;
if(l==r){
tr[root].val=wt[l]%p;
return;
}
long long mid=(l+r)/2;
build(root*2,l,mid);
build(root*2+1,mid+1,r);
tr[root].val=(tr[root*2].val+tr[root*2+1].val)%p;
}
void pushdown(long long root){
tr[root*2].tag+=tr[root].tag;
tr[root*2].tag%p;
tr[root*2+1].tag+=tr[root].tag;
tr[root*2+1].tag%p;
tr[root*2].val+=tr[root].tag*(tr[root*2].r-tr[root*2].l+1)%p;
tr[root*2].val%p;
tr[root*2+1].val+=tr[root].tag*(tr[root*2+1].r-tr[root*2+1].l+1)%p;
tr[root*2+1].val%p;
tr[root].tag=0;
}
void updata(long long root,long long l,long long r,long long z){
long long ll=tr[root].l,rr=tr[root].r;
if(l>rr||ll>r){
return;
}
if(l<=ll&&r>=rr){
tr[root].tag+=z;
tr[root].tag%=p;
tr[root].val+=z*(tr[root].r-tr[root].l+1)%p;
tr[root].val%=p;
return;
}
pushdown(root);
updata(root*2,l,r,z);
updata(root*2+1,l,r,z);
tr[root].val=(tr[root*2].val+tr[root*2+1].val)%p;
}
long long fsum(long long root,long long l,long long r){
long long ll=tr[root].l,rr=tr[root].r;
if(l>rr||ll>r){
return 0;
}
if(l<=ll&&r>=rr){
return tr[root].val;
}
pushdown(root);
return (fsum(root*2,l,r)+fsum(root*2+1,l,r))%p;
}
void swa(long long x,long long y,long long z){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
updata(1,num[top[x]],num[x],z);
x=fa[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
updata(1,num[x],num[y],z);
}
long long sws(long long x,long long y){
long long sum=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
swap(x,y);
}
sum=(sum+fsum(1,num[top[y]],num[y]))%p;
y=fa[top[y]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
sum=(sum+fsum(1,num[x],num[y]))%p;
return sum;
}
void sta(long long x,long long z){
updata(1,num[x],num[x]+son[x]-1,z);
}
long long sts(long long x){
return fsum(1,num[x],num[x]+son[x]-1);
}
int main(){
cin>>n>>m>>r>>p;
for(long long i=1;i<=n;i++){
cin>>w[i];
}
for(long long i=1;i<n;i++){
long long u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
dfs1(1,0,r);
cnt=0;
dfs2(1,r);
build(1,1,n);
for(long long i=1;i<=m;i++){
long long op,x,y,z;
cin>>op;
if(op==1){
cin>>x>>y>>z;
swa(x,y,z%p);
}else if(op==2){
cin>>x>>y;
cout<<sws(x,y)<<endl;
}else if(op==3){
cin>>x>>z;
sta(x,z%p);
}else if(op==4){
cin>>x;
cout<<sts(x)<<endl;
}
}
return 0;
}
by control_our_own_life @ 2023-12-09 21:40:05
nj!
by zsh_haha @ 2023-12-09 21:41:28
调出来了,此贴终.
by control_our_own_life @ 2023-12-09 21:41:57
@zsh_haha 6
by Kniqht @ 2023-12-30 13:33:03
@zsh_haha 大佬,所以您是哪里错了,我也28pts TLE
by zsh_haha @ 2023-12-30 17:51:31
@Kniqht 检查一下在主函数调用函数时参数是否给错了