10pts求条,拼尽全力无法AC
查看原帖
10pts求条,拼尽全力无法AC
939957
wanjiabao楼主2025/1/23 15:34

只能AC测试点11,code:

#include<bits/stdc++.h>
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
struct segment{
	int l,r;
	int maxn,tadd,teql;
}t[400005];
int n,m,r,p,dcnt;
int dep[100005],tid[100005],rnk[100005],fa[100005],siz[100005],top[100005],son[100005],to[100005],val[100005];
struct node{
	int v,w,id;
};
vector<node>g[100005];
void pushup(int id){
	t[id].maxn=max(t[ls].maxn,t[rs].maxn);
}
void pushdown(int id){
	if(t[id].tadd){
		t[ls].tadd+=t[id].tadd;
		t[rs].tadd+=t[id].tadd;
		t[ls].maxn+=t[id].tadd;
		t[rs].maxn+=t[id].tadd;
		t[id].tadd=0;
	}
	if(t[id].teql!=-1){
		t[ls].teql=t[rs].teql=t[id].teql;
		t[ls].maxn=t[rs].maxn=t[id].teql;
		t[ls].tadd=t[rs].tadd=0;
		t[id].teql=-1;
	}
}
void build(int id,int l,int r){
	t[id].l=l;
	t[id].r=r;
	t[id].teql=-1;
	if(l==r){
		t[id].maxn=val[rnk[l]];
		return;
	}
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(id);
}
void updateadd(int id,int l,int r,int k){
	if(t[id].l>r||t[id].r<l)return;
	if(t[id].l>=l&&t[id].r<=r){
		t[id].maxn+=k;
		t[id].tadd+=k;
		return;
	}
	pushdown(id);
	updateadd(ls,l,r,k);
	updateadd(rs,l,r,k);
	pushup(id);
}
void modifyadd(int u,int v,int k){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		updateadd(1,tid[top[u]],tid[u],k);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	if(u!=v)updateadd(1,tid[u]+1,tid[v],k);
}
void updateql(int id,int l,int r,int k){
	if(t[id].l>r||t[id].r<l)return;
	if(t[id].l>=l&&t[id].r<=r){
		t[id].tadd=0;
		t[id].maxn=k;
		t[id].teql=k;
		return;
	}
	pushdown(id);
	updateql(ls,l,r,k);
	updateql(rs,l,r,k);
	pushup(id);
}
void modifyeql(int u,int v,int k){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		updateql(1,tid[top[u]],tid[u],k);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	if(u!=v)updateql(1,tid[u]+1,tid[v],k);
}
int ask(int id,int l,int r){
	if(l>r)return -1e9;
	if(t[id].l>r||t[id].r<l)return -1e9;
	if(t[id].l>=l&&t[id].r<=r){
		return t[id].maxn;
	}
	pushdown(id);
	return max(ask(ls,l,r),ask(rs,l,r));
}
int query(int u,int v){
	if(u==v)return 0;
	int res=-1e9;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res=max(res,ask(1,tid[top[u]],tid[u]));
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	if(u!=v)res=max(res,ask(1,tid[u]+1,tid[v]));
	return res;
}
void dfs1(int u,int p,int d){
	fa[u]=p;
	siz[u]=1;
	dep[u]=d;
	son[u]=0;
	for(auto v:g[u]) {
		if(v.v==p)continue;
		dfs1(v.v,u,d+1);
		val[v.v]=v.w;
		to[v.id]=v.v;
		siz[u]+=siz[v.v];
		if(!son[u]||siz[v.v]>siz[son[u]])son[u]=v.v;
	}
}
void dfs2(int u,int tp){
	top[u]=tp;
	tid[u]=++dcnt;
	rnk[dcnt]=u;
	if(son[u])dfs2(son[u],tp);
	for(auto v:g[u]){
		if(v.v!=fa[u]&&v.v!=son[u])dfs2(v.v,v.v);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1,u,v,w;i<n;i++){
		cin>>u>>v>>w;
		g[u].push_back({v,w,i});
		g[v].push_back({u,w,i}); 
	}
	dfs1(1,0,0);
	dfs2(1,1);
	build(1,1,n);
	string s;
	while(cin>>s,s!="Stop"){
		if(s=="Change"){
			int k,w;
			cin>>k>>w;
			updateql(1,tid[to[k]],tid[to[k]],w);
		}else if(s=="Cover"){
			int u,v,w;
			cin>>u>>v>>w;
			modifyeql(u,v,w);
		}else if(s=="Add"){
			int u,v,w;
			cin>>u>>v>>w;
			modifyadd(u,v,w);
		}else{
			int l,r;
			cin>>l>>r;
			cout<<query(l,r)<<"\n";
		}
	}
}
2025/1/23 15:34
加载中...