社区讨论

为什么没有输出啊??

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

正在加载回复...