社区讨论
???怎么就WA了呢????
P3178[HAOI2015] 树上操作参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi6mfnmd
- 此快照首次捕获于
- 2025/11/20 07:16 4 个月前
- 此快照最后确认于
- 2025/11/20 07:16 4 个月前
#####树剖AC的代码去掉取模,ans改LL为什么就全wa了???????
CPP#include<bits/stdc++.h>
#define Ri register int
#define ll long long
using namespace std;
const int maxn=100010;
struct node{
int val;//若以后有其他操作可以修改
}a[maxn];
int Head[maxn],Next[maxn<<1],V[maxn<<1],tot=0;
int n,m;
inline void Add(int u,int v){
V[++tot]=v;
Next[tot]=Head[u];
Head[u]=tot;
}
int son[maxn],size[maxn],fa[maxn],deep[maxn];
inline void fdfs(int u){
int v;
son[u]=0;
size[u]=1;
for(Ri i=Head[u];i;i=Next[i]){
v=V[i];
if(fa[u]==v)continue;
fa[v]=u;
deep[v]=deep[u]+1;
fdfs(v);
size[u]+=size[v];
if(size[son[u]]<size[v])son[u]=v;
}
}
int maxson[maxn],tid[maxn],nid[maxn],top[maxn],newid=0;
inline void sdfs(int u,int anc){
tid[u]=++newid;nid[newid]=u;
top[u]=anc;
maxson[u]=newid;
if(son[u]){
sdfs(son[u],anc);
maxson[u]=max(maxson[son[u]],maxson[u]);
}
for(Ri i=Head[u];i;i=Next[i]){
int v=V[i];
if(v==fa[u]||v==son[u])continue;
sdfs(v,v);
maxson[u]=max(maxson[v],maxson[u]);
}
}
int tree[maxn<<2],lazy[maxn<<2];
inline void pushup(int x){
tree[x]=(tree[x<<1]+tree[x<<1|1]);
}
inline void pushdown(int x,int l,int r){
if(!lazy[x])return ;
int k=lazy[x];
lazy[x]=0;
lazy[x<<1]=(lazy[x<<1]+k);
lazy[x<<1|1]=(lazy[x<<1|1]+k);
int mid=(l+r)>>1;
tree[x<<1]=(tree[x<<1]+(mid-l+1)*k);
tree[x<<1|1]=(tree[x<<1|1]+(r-mid)*k);
}
inline void add(int x,int l,int r,int si,int ti,int k){
if(si>ti)swap(si,ti);
if(si<=l&&r<=ti){
tree[x]=(tree[x]+(r-l+1)*k);
lazy[x]=(lazy[x]+k);
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r);
if(si<=mid)add(x<<1,l,mid,si,ti,k);
if(ti>=mid+1)add(x<<1|1,mid+1,r,si,ti,k);
pushup(x);
}
ll ans=0;
inline void query(int x,int l,int r,int si,int ti){
if(si>ti)swap(si,ti);
if(si<=l&&r<=ti){
ans=(ans+tree[x]);
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r);
if(si<=mid)query(x<<1,l,mid,si,ti);
if(mid+1<=ti)query(x<<1|1,mid+1,r,si,ti);
pushup(x);
}
inline void build(int x,int l,int r){
if(l==r){
tree[x]=a[nid[l]].val;
return;
}
int mid=(l+r)>>1;
if(l<r){
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
}
pushup(x);
}
inline void work(int u,int v,int k){
int x=top[u],y=top[v];
while(x!=y){
if(deep[x]<deep[y]){
swap(x,y);
swap(u,v);
}
add(1,1,n,tid[u],tid[x],k);
u=fa[x];x=top[u];
}
if(u==v)add(1,1,n,tid[u],tid[u],k);
else {
if(deep[u]<deep[v])swap(u,v);
add(1,1,n,tid[u],tid[v],k);
}
}
inline void ask(int u,int v){
int x=top[u],y=top[v];
while(x!=y){
if(deep[x]<deep[y]){
swap(u,v);
swap(x,y);
}
query(1,1,n,tid[x],tid[u]);
u=fa[x];x=top[u];
}
if(u==v)query(1,1,n,tid[u],tid[u]);
else{
if(deep[u]<deep[v])swap(u,v);
query(1,1,n,tid[u],tid[v]);
}
}
template <typename T> void read(T &x){
x=0;char c=getchar();
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())x=x*10+c-'0';
}
int main(){
read(n);read(m);
for(Ri i=1;i<=n;i++){
read(a[i].val);
}
int u,v,d,flag;
for(Ri i=1;i<n;i++){
read(u);read(v);
Add(u,v);
Add(v,u);
}
deep[1]=1;
fdfs(1);
sdfs(1,1);
build(1,1,n);
for(Ri i=1;i<=m;i++){
read(flag);
if(flag==3){
ans=0;
read(u);
ask(u,1);
printf("%lld\n",ans);
}
if(flag==2){
read(u);scanf("%d",&d);
add(1,1,n,tid[u],maxson[u],d);
}
if(flag==1){
read(u);scanf("%d",&d);
add(1,1,n,tid[u],tid[u],d);
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...