萌新刚学OI,求助卡常
查看原帖
萌新刚学OI,求助卡常
119261
7KByte楼主2020/7/31 21:53

Rt,被卡常了求助(也可能是写挂了。

放个100行代码很可能没人看/kk

#include<bits/stdc++.h>
#define rep(i,a,b) for(register int i=a;i<=b;i++)
#define pre(i,a,b) for(register int i=a;i>=b;i--)
#define N 200005
using namespace std;
int n,p,q,h[N],tot;
struct edge{
	int to,nxt;
}e[N];
void adde(int x,int y){
	e[++tot].nxt=h[x];h[x]=tot;e[tot].to=y;
}
int f[N][19],t,sz[N],dfn[N],idx,d[N];
void dfs(int x,int fa){
	f[x][0]=fa;sz[x]=1;dfn[x]=++idx;d[x]=d[fa]+1;
	rep(i,1,t)f[x][i]=f[f[x][i-1]][i-1];
	for(int i=h[x];i;i=e[i].nxt)if(e[i].to!=fa)
		dfs(e[i].to,x),sz[x]+=sz[e[i].to];
}
int lca(int x,int y){
	if(d[x]<d[y])swap(x,y);
	pre(i,t,0)if(d[f[x][i]]>=d[y])x=f[x][i];
	if(x==y)return x;
	pre(i,t,0)if(f[x][i]^f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}
struct node{
	int op,u,v,x,y,z;
}a[N],ll[N],rr[N],u[N];
inline node New(int op,int u,int v,int x,int y,int z){
	node now;now.op=op;now.u=u;now.v=v;now.x=x;now.y=y;now.z=z;return now;
}
int num,o[N],b[N],T,ans[N],c[N];
inline void add(int x,int y){for(;x<=n;x+=x&-x)c[x]+=y;}
inline int ask(int x){int sum=0;for(;x;x-=x&-x)sum+=c[x];return sum;}
inline void add(int l,int r,int y){add(l,y);add(r+1,-y);}
inline bool cmp1(node x,node y){return x.x<y.x;}
inline bool cmp2(node x,node y){return dfn[x.u]<dfn[y.u];}
void solve(int L,int R,int l,int r){
	if(L==R){rep(i,l,r)if(u[i].op)ans[u[i].op]=L;return;}
	int mid=(L+R)>>1,lt=0,rt=0,i=l,j=l,k;
	while(j<=r&&!u[j].op){
		if(u[j].y>mid)rr[++rt]=u[j++];
		else ll[++lt]=u[j++];
	}k=j;
	while(j<=r){
		while(i<k&&u[i].x<=dfn[u[j].u]){
			if(u[i].y<=mid)add(u[i].u,u[i].v,u[i].z);
			i++;
		}
		int sum=ask(dfn[u[j].v]);
		if(sum>=u[j].x)ll[++lt]=u[j];
		else rr[++rt]=u[j],rr[rt].x-=sum;
		j++;
	}
	while(i>1){i--;if(u[i].y<=mid)add(u[i].u,u[i].v,-u[i].z);}
	for(i=1;i<=lt;i++)u[l+i-1]=ll[i];
	for(i=1;i<=rt;i++)u[l+lt+i-1]=rr[i];
	solve(L,mid,l,l+lt-1);solve(mid+1,R,l+lt,r);
}
int main(){
	scanf("%d%d%d",&n,&p,&q);
	t=log2(n);
	rep(i,1,n-1){
		int x,y;scanf("%d%d",&x,&y);
		adde(x,y);adde(y,x);
	}
	dfs(1,0);
	rep(i,1,p)scanf("%d %d %d",&a[i].u,&a[i].v,&a[i].x),a[i].op=0,o[i]=a[i].x;
	sort(o+1,o+p+1);
	rep(i,1,p)if(i==1||o[i]!=o[i-1])b[++T]=o[i];
	rep(i,1,q)scanf("%d %d %d",&a[i+p].u,&a[i+p].v,&a[i+p].x),a[i+p].op=i;
	rep(i,1,p+q)if(dfn[a[i].u]>dfn[a[i].v])swap(a[i].u,a[i].v);
	rep(i,1,p){
		//cout<<"st "<<i<<endl;
		a[i].x=lower_bound(b+1,b+T+1,a[i].x)-b;
		if(lca(a[i].u,a[i].v)==a[i].u){
			int dx=a[i].v;
			pre(j,t,0)if(d[f[dx][j]]>d[a[i].u])dx=f[dx][j];
			int lx=1,rx=dfn[dx]-1;
			int ly=dfn[a[i].v],ry=dfn[a[i].v]+sz[a[i].v]-1;
			//cout<<lx<<" "<<rx<<" "<<ly<<" "<<ry<<endl;
			u[++num]=New(0,ly,ry,lx,a[i].x,1);u[++num]=New(0,ly,ry,rx+1,a[i].x,-1);
			lx=ly;rx=ry;
			ly=dfn[dx]+sz[dx];ry=n;
			if(ly>n)continue;
			u[++num]=New(0,ly,ry,lx,a[i].x,1);u[++num]=New(0,ly,ry,rx+1,a[i].x,-1);
			//cout<<lx<<" "<<rx<<" "<<ly<<" "<<ry<<endl;
		}
		else{
			int lx=dfn[a[i].u],rx=dfn[a[i].u]+sz[a[i].u]-1;
			int ly=dfn[a[i].v],ry=dfn[a[i].v]+sz[a[i].v]-1;
			u[++num]=New(0,ly,ry,lx,a[i].x,1),u[++num]=New(0,ly,ry,rx+1,a[i].x,-1);
		}
	}
	sort(a+p+1,a+p+q+1,cmp2);
	sort(u+1,u+num+1,cmp1);
	rep(i,1,q)u[++num]=New(a[i+p].op,a[i+p].u,a[i+p].v,a[i+p].x,0,0);
	//rep(i,1,num)printf("%2d %2d %2d %2d %2d %2d\n",u[i].op,u[i].u,u[i].v,u[i].x,u[i].y,u[i].z);
	solve(1,T,1,num);
	rep(i,1,q)printf("%d\n",b[ans[i]]);
	return 0;
} 
2020/7/31 21:53
加载中...