TLE求助
查看原帖
TLE求助
34225
bulijoijiodibuliduo楼主2021/5/9 18:15

刚学树链剖分
老是t
代码:

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1<<14,M=1<<15;
struct graph{
	int edhead[N],ednxt[M],edw[M],edto[M],edtot=0;
	void addedge(int u,int v,int w){
		edtot++;
		edw[edtot]=w;
		ednxt[edtot]=edhead[u];
		edto[edtot]=v;
		edhead[u]=edtot;
	}
	void clear(){
		mem(edhead,0);
		edtot=0;
	}
}tree;
struct sgt{
#define mid(l,r) ((l+r)>>1)
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
	int val[M];
	void pu(int p){
		val[p]=max(val[lc(p)],val[rc(p)]);
	}
	void build(int p,int l,int r,int *arr){
		if(l==r){
			val[p]=arr[l];
			return;
		}
		build(lc(p),l,mid(l,r),arr);
		build(rc(p),mid(l,r)+1,r,arr);
		pu(p);
	}
	void change(int p,int l,int r,int pos,int v){
		if(l==r){
			val[p]=v;
			return;
		}
		if(pos<=mid(l,r)){
			change(lc(p),l,mid(l,r),pos,v);
		}else{
			change(rc(p),mid(l,r)+1,r,pos,v);
		}
		pu(p);
	}
	int query(int p,int l,int r,int ll,int rr){
		if(ll<=l&&r<=rr){
			return val[p];
		}
		if(rr<=mid(l,r)){
			return query(lc(p),l,mid(l,r),ll,rr);
		}else if(ll>mid(l,r)){
			return query(rc(p),mid(l,r)+1,r,ll,rr);
		}else{
			return max(query(rc(p),mid(l,r)+1,r,ll,rr),query(lc(p),l,mid(l,r),ll,rr));
		}
	}
#undef lc
#undef rc
#undef mid
}sgtree;
#define graph_go(g,p) for(int i=g.edhead[p],to=g.edto[i];i;i=g.ednxt[i],to=g.edto[i])
int w[N],son[N],f[N],dep[N],top[N],sz[N],toson[N],tot,n,mp[M],rmap[M],edval[M];
void dfs1(int p,int fa){
	f[p]=fa;
	son[p]=0;
	sz[p]=1;
	graph_go(tree,p){
		if(to==fa)continue;
		dep[to]=dep[p]+1;
		dfs1(to,p);
		sz[p]+=sz[to];
		if(sz[to]>sz[son[p]]){
			son[p]=to;
			toson[p]=(i+1)>>1;
		}
	}
}
void dfs2(int p,int tp,int ed){
	top[p]=tp;
	w[p]=++tot;
	mp[ed]=tot;
	rmap[tot]=ed;
	if(son[p])dfs2(son[p],tp,toson[p]);
	graph_go(tree,p){
		if(to==f[p]||to==son[p])continue;
		dfs2(to,to,(i+1)>>1);
	}
}
int qry(int x,int y){
	int ret=0,top1=top[x],top2=top[y];
	while(top1!=top2){
		if(dep[top1]<dep[top2])swap(top1,top2),swap(x,y);
		ret=max(ret,sgtree.query(1,1,n,w[top1],w[x]));
		x=f[top1];
		top1=top[x];
	}
	if(x==y)return ret;
	if(dep[x]<dep[y])swap(x,y);
	return max(ret,sgtree.query(1,1,n,w[son[y]],w[x]));
}
void cg(int a,int b){
	sgtree.change(1,1,n,mp[a],b);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;
	cin>>t;
	while(t--){
		tot=0;
		tree.clear();
		cin>>n;
		for(int i=1;i<n;i++){
			int u,v,w;
			cin>>u>>v>>w;
			tree.addedge(u,v,w);
			tree.addedge(v,u,w);
		}
		dep[1]=1;
		dfs1(1,0);
		dfs2(1,1,0);
		for(int i=1;i<=n;i++){
			edval[i]=tree.edw[2*rmap[i]];
		}
		sgtree.build(1,1,n,edval);
		string op;
		int op1,op2;
		while(cin>>op&&op!="DONE"){
			cin>>op1>>op2;
			if(op=="QUERY"){
				cout<<qry(op1,op2)<<endl;
			}else{
				cg(op1,op2);
			}
		}
	}
}

哪位巨佬能帮帮我

2021/5/9 18:15
加载中...