c++17转c求助
  • 板块学术版
  • 楼主STARSczy
  • 当前回复7
  • 已保存回复8
  • 发布时间2024/3/18 15:51
  • 上次更新2024/3/18 19:45:00
查看原帖
c++17转c求助
656765
STARSczy楼主2024/3/18 15:51

rt,萌新不会 c 语言,求助!!玄五关。

#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=(l),i##end=(r);i<=i##end;++i)
#define per(i,r,l) for(int i=(r),i##end=(l);i>=i##end;--i)
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=1e5+10,maxm=1e6+10,mod=998244353;

int T,n,idtt,eu[maxn],ev[maxn],ew[maxn],dep[maxn],sz[maxn],fa[maxn];
int hs[maxn],lt[maxn],id[maxn],tmp[maxn],val[maxn],mx[maxn<<2];
vector<pii> e[maxn];
void dfs1(int u){
	sz[u]=1;
	for(auto &[v,w]:e[u]) if(v!=fa[u]){
		fa[v]=u,val[v]=w,dep[v]=dep[u]+1,dfs1(v),sz[u]+=sz[v];
		if(sz[v]>sz[hs[u]]) hs[u]=v;
	}
}
void dfs2(int u){
	if(!lt[u]) lt[u]=u;
	lt[hs[u]]=lt[u],tmp[id[u]=++idtt]=val[u];
	if(hs[u]) dfs2(hs[u]);
	for(auto &[v,w]:e[u]) if(v!=fa[u]&&v!=hs[u]) dfs2(v);
}
inline void pushup(int id){mx[id]=max(mx[id<<1],mx[id<<1|1]);}
void build(int id,int l,int r,int *tmp){
	if(l==r){
		mx[id]=tmp[l];
		return;
	}
	int mid=l+r>>1;
	build(id<<1,l,mid,tmp),build(id<<1|1,mid+1,r,tmp),pushup(id);
}
void change(int id,int l,int r,int k,int x){
	if(l==r){
		mx[id]=x;
		return;
	}
	int mid=l+r>>1;
	if(k<=mid) change(id<<1,l,mid,k,x);
	else change(id<<1|1,mid+1,r,k,x);
	pushup(id);
}
int query(int id,int l,int r,int lq,int rq){
	if(lq<=l&&r<=rq) return mx[id];
	int mid=l+r>>1,ans=0;
	if(lq<=mid) ans=max(ans,query(id<<1,l,mid,lq,rq));
	if(rq>mid) ans=max(ans,query(id<<1|1,mid+1,r,lq,rq));
	return ans;
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		cin>>n,idtt=0;
		rep(i,1,n-1){
			cin>>eu[i]>>ev[i]>>ew[i];
			e[eu[i]].push_back({ev[i],ew[i]}),e[ev[i]].push_back({eu[i],ew[i]});
		}
		dfs1(1),dfs2(1),build(1,1,n,tmp);
		rep(o,1,3e5){
			int u,v,k,w,ans=0;
			string opt;
			cin>>opt;
			if(opt=="DONE") break;
			if(opt=="CHANGE"){
				cin>>k>>w;
				if(dep[eu[k]]<dep[ev[k]]) swap(eu[k],ev[k]);
				change(1,1,n,id[eu[k]],w);
				continue;
			}
			cin>>u>>v;
			for(;lt[u]!=lt[v];u=fa[lt[u]]){
				if(dep[lt[u]]<dep[lt[v]]) swap(u,v);
				ans=max(ans,query(1,1,n,id[lt[u]],id[u]));
			}
			if(id[u]>id[v]) swap(u,v);
			if(u!=v) ans=max(ans,query(1,1,n,id[u]+1,id[v]));
			cout<<ans<<'\n';
		}
		rep(i,1,n) e[i].clear();
		#define cl(x) memset(x,0,sizeof x)
		cl(eu),cl(ev),cl(ew),cl(dep),cl(sz),cl(fa),cl(hs),cl(lt),cl(id),cl(tmp),cl(val),cl(mx);
	}
	return 0;
}
2024/3/18 15:51
加载中...