社区讨论
为什么没有输出啊??
P2590[ZJOI2008] 树的统计参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lqro2gkk
- 此快照首次捕获于
- 2023/12/30 14:13 2 年前
- 此快照最后确认于
- 2023/12/30 14:31 2 年前
破防了,有输入,然后我写了printf,然后没有输出?
CPP#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10,M=N*2;
int n,m;ll nw[N],w[N];
int h[N],e[M],ne[M],idx;
int id[N],cnt;
int dep[N],sz[N],top[N],fa[N],son[N];
struct Node{
int l,r;
ll sum,v;
}tr[N];
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;}
void dfs1(int u,int father,int depth){
dep[u]=depth,fa[u]=father,sz[u]=1;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==father) continue;
dfs1(j,u,depth+1);
sz[u]+=sz[j];
if(sz[son[u]]<sz[j]) son[u]=j;
}
}
void dfs2(int u,int t){
id[u]=++cnt;nw[cnt]=w[u];top[u]=t;
if(!son[u]) return;
dfs2(son[u],t);
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa[u]||j==son[u]) continue;
dfs2(j,j);
}
}
void pushup(int u){
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
}
void build(int u,int l,int r){
tr[u]=Node{l,r,nw[r],nw[r]};
if(l==r) return;
int mid=l+r>>1;
build(u<<1,l,mid);build(u<<1|1,mid+1,r);
pushup(u);
}
void modify(int u,int t,int k){
if(tr[u].l>t||tr[u].r<t) return;
if(tr[u].l==t&&tr[u].r==t){
tr[u].sum=tr[u].v=k;
return;
}
modify(u<<1,t,k);modify(u<<1|1,t,k);
pushup(u);
}
ll query(int u,int l,int r,int opt){
if(opt){
if(tr[u].l>r||tr[u].r<l) return 0;
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
return query(u<<1,l,r,opt)+query(u<<1|1,l,r,opt);
}
else{
if(tr[u].l>r||tr[u].r<l) return 0;
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].v;
return max(query(u<<1,l,r,opt),query(u<<1|1,l,r,opt));
}
}
ll get_path(int u,int v,int opt){
ll res=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
if(opt) res+=query(1,id[top[u]],id[u],opt);
if(!opt) res=max(res,query(1,id[top[u]],id[u],opt));
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
if(opt) res+=query(1,id[v],id[u],opt);
if(!opt) res=max(res,query(1,id[v],id[u],opt));
return res;
}
char s[10];
int main(){
memset(h,-1,sizeof(h));
scanf("%d",&n);int x,y;
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
dfs1(1,-1,1);dfs2(1,1);build(1,1,n);
scanf("%d",&m);
while(m--){
scanf("%s",s);
scanf("%d%d",&x,&y);
if(s=="QMAX") printf("%lld\n",get_path(x,y,0));
else if(s=="QSUM") printf("%lld\n",get_path(x,y,1));
else modify(1,id[x],y);
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...