求助,只过了HACK,其他全WA
查看原帖
求助,只过了HACK,其他全WA
310802
_Diu_楼主2021/12/2 21:22

蒟蒻写了个树剖,结果第 11,12 个点 A 了,其他全 WA。

求助。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,inf=1001;
int n,m,dfn[N],top[N],fa[N],son[N],siz[N],tot,w[N],pl[N];
char ch[10];
struct edge{int v,w,id;};
vector<edge> g[N];
struct tree{
	int s,mx,mn,os;
}tr[N<<2];
#define ls (o<<1)
#define rs (o<<1|1)
void mul_1(int o){
	tr[o].os^=1,tr[o].s*=-1;
	int tmp=tr[o].mx;tr[o].mx=-tr[o].mn;tr[o].mn=-tmp;
}
void push_down(int o){
	if(!tr[o].os)return;
	mul_1(ls),mul_1(rs);
	tr[o].os=0;
}
void push_up(int o){
	tr[o].s=tr[ls].s+tr[rs].s;
	tr[o].mx=max(tr[ls].mx,tr[rs].mx);
	tr[o].mn=min(tr[ls].mn,tr[rs].mn);
}
void change(int o,int l,int r,int x,int v1,int v2,int v3){
	if(l==r)return (void)(tr[o]={v1,v2,v3,0});
	push_down(o);
	int mid=l+r>>1;
	if(x<=mid)change(ls,l,mid,x,v1,v2,v3);
	else change(rs,mid+1,r,x,v1,v2,v3);
	push_up(o);
}
void update(int o,int l,int r,int x,int y){
	if(x>y)return;
	if(x<=l&&r<=y)return (void)(mul_1(o));
	push_down(o);
	int mid=l+r>>1;
	if(x<=mid)update(ls,l,mid,x,y);
	if(y>mid)update(rs,mid+1,r,x,y);
	push_up(o);
}
void Change(int u,int v){
	while(top[u]!=top[v]){
		if(dfn[u]<dfn[v])swap(u,v);
		update(1,1,n,dfn[top[u]],dfn[u]);
		u=fa[top[u]];
	}
	if(dfn[u]<dfn[v])swap(u,v);
	update(1,1,n,dfn[v]+1,dfn[u]);
}
int query_mx(int o,int l,int r,int x,int y){
	if(x>y)return -inf;
	if(x<=l&&r<=y)return tr[o].mx;
	push_down(o);
	int mid=l+r>>1,mx=-inf;
	if(x<=mid)mx=query_mx(ls,l,mid,x,y);
	if(y>mid)mx=max(mx,query_mx(rs,mid+1,r,x,y));
	return mx;
}
int Max(int u,int v){
	int mx=-inf;
	while(top[u]!=top[v]){
		if(dfn[u]<dfn[v])swap(u,v);
		mx=max(mx,query_mx(1,1,n,dfn[top[u]]+1,dfn[u]));
		u=fa[top[u]];
	}
	if(dfn[u]<dfn[v])swap(u,v);
	mx=max(mx,query_mx(1,1,n,dfn[v]+1,dfn[u]));
	return mx;
}
int query_mn(int o,int l,int r,int x,int y){
	if(x>y)return inf;
	if(x<=l&&r<=y)return tr[o].mn;
	push_down(o);
	int mid=l+r>>1,mn=inf;
	if(x<=mid)mn=query_mn(ls,l,mid,x,y);
	if(y>mid)mn=min(mn,query_mn(rs,mid+1,r,x,y));
	return mn;
}
int Min(int u,int v){
	int mn=inf;
	while(top[u]!=top[v]){
		if(dfn[u]<dfn[v])swap(u,v);
		mn=min(mn,query_mn(1,1,n,dfn[top[u]],dfn[u]));
		u=fa[top[u]];
	}
	if(dfn[u]<dfn[v])swap(u,v);
	mn=min(mn,query_mn(1,1,n,dfn[v]+1,dfn[u]));
	return mn;
}
int query_sum(int o,int l,int r,int x,int y){
	if(x>y)return 0;
	if(x<=l&&r<=y)return tr[o].s;
	push_down(o);
	int mid=l+r>>1,s=0;
	if(x<=mid)s=query_sum(ls,l,mid,x,y);
	if(y>mid)s+=query_sum(rs,mid+1,r,x,y);
	return s;
}
int Sum(int u,int v){
	int s=0;
	while(top[u]!=top[v]){
		if(dfn[u]<dfn[v])swap(u,v);
		s+=query_sum(1,1,n,dfn[top[u]],dfn[u]);
		u=fa[top[u]];
	}
	if(dfn[u]<dfn[v])swap(u,v);
	s+=query_sum(1,1,n,dfn[v]+1,dfn[u]);
	return s;
}
void dfs(int u){
	int mx=0;siz[u]=1;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].v;
		if(v==fa[u])continue;
		fa[v]=u;
		pl[g[u][i].id]=v;
		w[v]=g[u][i].w;
		dfs(v);
		siz[u]+=siz[v];
		if(siz[v]>mx)mx=siz[v],son[u]=v;
	}
}
void dfs2(int u,int head){
	dfn[u]=++tot,top[u]=head;
	if(u)change(1,1,n,tot,w[u],w[u],w[u]);
	else change(1,1,n,tot,0,-inf,inf);
	if(son[u])dfs2(son[u],head);
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].v;
		if(v==fa[u]||v==son[u])continue;
		dfs2(v,v);
	}
}
signed main(){
	scanf("%d",&n);
	for(int u,v,w,i=1;i<n;i++){
		scanf("%d%d%d",&u,&v,&w);
		g[u].push_back({v,w,i});
		g[v].push_back({u,w,i});
	}
	dfs(0);
	dfs2(0,0);
	for(int i=1;i<n;i++)pl[i]=dfn[pl[i]];
	scanf("%d",&m);
	for(int x,y,i=1;i<=m;i++){
		scanf("%s%d%d",ch,&x,&y);
		if(ch[0]=='C')change(1,1,n,pl[x],y,y,y);
		else if(ch[0]=='N')Change(x,y);
		else if(ch[1]=='U')printf("%d\n",Sum(x,y));
		else if(ch[1]=='A')printf("%d\n",Max(x,y));
		else printf("%d\n",Min(x,y));
	}
}
2021/12/2 21:22
加载中...