调了三天,说一下自己的错误
查看原帖
调了三天,说一下自己的错误
421291
Noble_Wolf楼主2023/10/27 18:44
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int re(){
	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*10+ch-'0';ch=getchar();}
	return x*f;
}
void file(){
	freopen("P1505_1.in","r",stdin);
	freopen("zkr.ans","w",stdout);
}
const int N = 2e5+10;
int n,m,r,MOD,A[N],a[N],cnt,h[N];
struct edge{
	int v,nxt,w;
}e[N<<1];
void adde(int u,int v,int w){
	e[++cnt]={v,h[u],w};
	h[u]=cnt;
}
int dep[N],siz[N],top[N],son[N],id[N],f[N],root;
void dfs1(int u,int fa){
	f[u]=fa;
	dep[u]=dep[fa]+1;
	siz[u]=1;
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v!=fa){
			A[v]=e[i].w;
			dfs1(v,u);
			siz[u]+=siz[v];
			if(!son[u]||siz[son[u]]<siz[v])son[u]=v;
		}
	}
}
void dfs2(int u,int num){
	id[u]=++cnt;
	a[cnt]=A[u];
	top[u]=num;
	if(!son[u])return;
	dfs2(son[u],num);
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v!=f[u]&&v!=son[u]){
			dfs2(v,v);
		}
	}
}
struct node{
	int maxn,minn,sum,tag;
}t[N<<2];
void pushup(int p){
	t[p]={max(t[p<<1].maxn,t[p<<1|1].maxn),min(t[p<<1].minn,t[p<<1|1].minn),t[p<<1].sum+t[p<<1|1].sum,t[p].tag};
}
void build(int p,int l,int r){
	t[p]={-1010,1010,0,0};
	if(l==r){
		t[p]={a[l],a[l],a[l],0};
		return;
	}
	int mid = l+r >> 1;//dsadasfsa
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
void change(int p){
	t[p]={-t[p].minn,-t[p].maxn,-t[p].sum,t[p].tag^1};
}
void pushdown(int p){
	if(t[p].tag){
		change(p<<1);
		change(p<<1|1);
		t[p].tag=0; 
	}
}
void update_N(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y){change(p);return;}
	int mid = l+r >> 1;
	pushdown(p);
	if(x<=mid)update_N(p<<1,l,mid,x,y);
	if(y>mid)update_N(p<<1|1,mid+1,r,x,y);
	pushup(p);
}
void update_C(int p,int l,int r,int x,int w){
	if(l==r){
		t[p]={w,w,w,0};
		return;
	}
	int mid = l+r >> 1;
	pushdown(p);
	if(x<=mid)update_C(p<<1,l,mid,x,w);
	if(x>mid)update_C(p<<1|1,mid+1,r,x,w);
	pushup(p);
}
void update_range(int x,int y){//oppsite 0
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		update_N(1,1,n,id[top[x]],id[x]);
		x=f[top[x]];
	}
	if(x!=y){
		if(dep[x]>dep[y])swap(x,y);
		update_N(1,1,n,id[x]+1,id[y]);
	}
}
int	query_sum(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y)return t[p].sum;
	int mid = l+r >> 1,res=0;
	pushdown(p);
	if(x<=mid)res+=query_sum(p<<1,l,mid,x,y);
	if(y>mid)res+=query_sum(p<<1|1,mid+1,r,x,y);
	return res;
}
int	query_min(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y)return t[p].minn;
	int mid = l+r >> 1,res=1010;
	pushdown(p);
	if(x<=mid)res=min(res,query_min(p<<1,l,mid,x,y));
	if(y>mid)res=min(res,query_min(p<<1|1,mid+1,r,x,y));
	return res;
}
int	query_max(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y)return t[p].maxn;
	int mid = l+r >> 1,res=-1010;
	pushdown(p);
	if(x<=mid)res=max(res,query_max(p<<1,l,mid,x,y));
	if(y>mid)res=max(res,query_max(p<<1|1,mid+1,r,x,y));
	return res;
}
int query_range(int x,int y,int op){//sum 1    max 2   min 3
	int res=0,maxn=-1010,minn=1010;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		if(op==1)res+=query_sum(1,1,n,id[top[x]],id[x]);
		else if(op==2)maxn=max(maxn,query_max(1,1,n,id[top[x]],id[x]));
		else minn=min(minn,query_min(1,1,n,id[top[x]],id[x]));
		x=f[top[x]];
	}
	if(x!=y){
		if(dep[x]>dep[y])swap(x,y);
		if(op==1)res+=query_sum(1,1,n,id[x]+1,id[y]);
		else if(op==2)maxn=max(maxn,query_max(1,1,n,id[x]+1,id[y]));
		else minn=min(minn,query_min(1,1,n,id[x]+1,id[y]));
	}
	if(op==1)return res;
	else if(op==2)return maxn;
	else return minn;
}
struct gg{
	int x,y;
}q[N];
int main(){
//file(); 
	n=re();
	for(int i=1;i<n;i++){
		q[i].x=re()+1,q[i].y=re()+1;
		int z=re();
		adde(q[i].x,q[i].y,z);
		adde(q[i].y,q[i].x,z);
	}
	cnt=0;
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	int m=re();
	while(m--){
		string s;
		int i,j;
		cin>>s;
		i=re(),j=re();
		if(s=="C"){update_C(1,1,n,dep[q[i].y]>dep[q[i].x]?id[q[i].y]:id[q[i].x],j);}
		else if(s=="N")i++,j++,update_range(i,j);
		else if(s=="SUM")cout<<query_range(i+1,j+1,1)<<endl;
		else if(s=="MAX")cout<<query_range(i+1,j+1,2)<<endl;
		else cout<<query_range(i+1,j+1,3)<<endl;
	}
	return 0;
}
void change(int p){
	t[p]={-t[p].minn,-t[p].maxn,-t[p].sum,t[p].tag^1};
}

这块要异或,不能直接赋值为1

dep[q[i].y]>dep[q[i].x]?id[q[i].y]:id[q[i].x]

找深层的改!不能直接改id[q[i].y]!!!

2023/10/27 18:44
加载中...