AC了#1,剩下全WA,悬关求调
  • 板块P4114 Qtree1
  • 楼主QCurium
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/9/2 10:32
  • 上次更新2023/11/2 23:57:54
查看原帖
AC了#1,剩下全WA,悬关求调
363995
QCurium楼主2023/9/2 10:32
#include<bits/stdc++.h>
#define int long long
#define base 200807
#define mod 212370440130137903
using namespace std;
const int N=1e5+5;
int n,tot=0,cnt=0;
int head[N],dep[N],siz[N],fa[N],w[N],dfn[N],son[N],top[N],ba[N];
struct edge{
	int to,next,z,ii;
}e[N*2];
struct node{
	int l,r;
	int sum,mx;
}a[N*4];
///////////////////////////////////////
void ade(int u,int v,int w,int sa){
	e[tot]=(edge){v,head[u],w,sa};
	head[u]=tot++;
	e[tot]=(edge){u,head[v],w,sa};
	head[v]=tot++;
	return ;
}
void dfs1(int nw,int f){
	fa[nw]=f;
	dep[nw]=dep[f]+1;
	siz[nw]=1;
	int asd=-1;
	for(int i=head[nw];~i;i=e[i].next){
		int er=e[i].to;
		if(er==f)
			continue;
		dfs1(er,nw);
		siz[nw]+=siz[er];
		if(siz[er]>asd){
			asd=siz[er];
			son[nw]=er;
		}
	}
	return ;
}
void dfs2(int nw,int t){
	dfn[nw]=++cnt;
	top[nw]=t;
	if(!son[nw])
		return ;
	dfs2(son[nw],t); 
	for(int i=head[nw];~i;i=e[i].next){
		int er=e[i].to;
		if(er==son[nw]){
			w[dfn[er]]=e[i].z;
			ba[e[i].ii]=dfn[er];
			continue;
		}
		if(er==fa[nw])
			continue;
		dfs2(er,er);
		w[dfn[er]]=e[i].z;
		ba[e[i].ii]=dfn[er];
	}
	return ;
}
///////////////////////////////////////
void push_up(int aa){
	a[aa].mx=max(a[aa*2].mx,a[aa*2+1].mx);
	return ;
}
void build(int aa,int l,int r){
	a[aa].l=l;
	a[aa].r=r;
	if(l==r){
		a[aa].sum=w[l];
		a[aa].mx=a[aa].sum;
		return ;
	}
	int mid=(l+r)>>1;
	build(aa*2,l,mid);
	build(aa*2+1,mid+1,r);
	push_up(aa);
	return ;
}
void modify(int aa,int lr,int z){
	if(a[aa].l==a[aa].r&&a[aa].l==lr){
		a[aa].sum=z;
		a[aa].mx=z;
		return ;
	}
	int mid=(a[aa].l+a[aa].r)>>1;
	if(lr<=mid)
		modify(aa*2,lr,z);
	else
		modify(aa*2+1,lr,z);
	push_up(aa);
	return ;
}
int query(int aa,int l,int r){
	if(a[aa].l>=l&&a[aa].r<=r)
		return a[aa].mx;
	int ans=-2147483647,mid=(a[aa].l+a[aa].r)>>1;
	if(l<=mid)
		ans=max(ans,query(aa*2,l,r));
	if(r>mid)
		ans=max(ans,query(aa*2+1,l,r));
	return ans;
}
///////////////////////////////////////
int qchain(int x,int y){
	int ans=-2147483647;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		ans=max(ans,query(1,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if(top[x]>top[y])
		swap(x,y);
	ans=max(ans,query(1,dfn[x]+1,dfn[y]));
	return ans;
}
///////////////////////////////////////
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	memset(head,-1,sizeof(head));
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v,h;
		cin>>u>>v>>h;
		ade(u,v,h,i);
	}
	dfs1(1,1);
	dfs2(1,1);
	build(1,1,n);
//	for(int i=1;i<=n;i++)
//		cout<<ba[i]<<'\n';
	while(1){
		string asd;
		int aa,bb;
		cin>>asd;
		if(asd[0]=='D')
			break;
		if(asd[0]=='C'){
			cin>>aa>>bb;
			modify(1,ba[aa],bb);
		}
		else{
			cin>>aa>>bb;
			if(aa>bb)
				swap(dfn[aa],dfn[bb]);
			if(aa==bb)
				cout<<0<<" asd"<<'\n';
			else
				cout<<qchain(aa,bb)<<'\n';
		}
	}
	return 0;
}

提交记录

2023/9/2 10:32
加载中...