60分TLE-二维线段树做法求卡常
查看原帖
60分TLE-二维线段树做法求卡常
366807
lgvc楼主2022/1/19 08:30

思路是转化为dfn序上的二维数点问题,再使用二维线段树

#include <bits/stdc++.h>
inline int min(int a,int b) {return a<b?a:b;}
#define INF 0x3f3f3f3f
static char buf[1000000],*paa=buf,*pd=buf;
static char buf2[1000000],*pp=buf2;
#define getchar() paa==pd&&(pd=(paa=buf)+fread(buf,1,1000000,stdin),paa==pd)?EOF:*paa++
inline void pc(char ch){
	if(pp-buf2==1000000) fwrite(buf2,1,1000000,stdout),pp=buf2;
	*pp++=ch;
}
inline void pcc(){
	fwrite(buf2,1,pp-buf2,stdout);
	pp=buf2;
}
inline int read(void){
	register int x(0);register char c(getchar());
	while(c<'0'||c>'9'){c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x;
}
void write(int x){
	if(x==INF) {
		pc('-');
		pc('1');
		return;
	}
	static int sta[20];
	int top=0;
	do{
		sta[top++]=x%10,x/=10;
	}while(x);
	while(top) pc(sta[--top]+48);
}
void we(int x){
	write(x);
	pc('\n');
}
int t,dfn[50009],ans,a[50009],b[50009],hd[50009],to[100009],nxt[100009],k,siz[50009];
inline void l(int u,int v) {nxt[++k]=hd[u],to[k]=v,hd[u]=k;}
void dfs(int n,int f) {
	dfn[n]=++t;siz[n]=1;
	for(int i=hd[n];i;i=nxt[i]) if(to[i]!=f) dfs(to[i],n),siz[n]+=siz[to[i]];
}
#define lls llss[n]
#define lrs lrss[n]
#define rls rlss[n]
#define rrs rrss[n]
#define md1 ((l1+r1)>>1)
#define md2 ((l2+r2)>>1)
int T,seg[5000009],kx,llss[500009],lrss[500009],rlss[500009],rrss[500009];
void up(int &n,int l1,int r1,int l2,int r2,int p1,int p2,int v) {
	if(!n) n=++kx;
	if(l1==r1&&l2==r2) {
		seg[n]=v;
		return;
	}
	if(p1<=md1&&p2<=md2) up(lls,l1,md1,l2,md2,p1,p2,v);
	if(p1<=md1&&p2>md2) up(lrs,l1,md1,md2+1,r2,p1,p2,v);
	if(p1>md1&&p2<=md2) up(rls,md1+1,r1,l2,md2,p1,p2,v);
	if(p1>md1&&p2>md2) up(rrs,md1+1,r1,md2+1,r2,p1,p2,v);
	seg[n]=min(min(seg[lls],seg[lrs]),min(seg[rls],seg[rrs]));
}
int q(int n,int l1,int r1,int l2,int r2,int L1,int R1,int L2,int R2) {
	if(!n) return INF;
	if(R1<l1||r1<L1||R2<l2||r2<L2) return INF;
	if(L1<=l1&&r1<=R1&&L2<=l2&&r2<=R2) {ans=min(ans,seg[n]);return seg[n];}
	if(seg[n]>ans) return INF;
	return min(min(q(lls,l1,md1,l2,md2,L1,R1,L2,R2),q(lrs,l1,md1,md2+1,r2,L1,R1,L2,R2)),
	min(q(rls,md1+1,r1,l2,md2,L1,R1,L2,R2),q(rrs,md1+1,r1,md2+1,r2,L1,R1,L2,R2)));
}
signed main(void) {
	int N=read(),M=read();
	seg[0]=INF;
	for(int i=1;i<N;i++) {
		a[i]=read(),b[i]=read();
		l(a[i],b[i]),l(b[i],a[i]);
	}
	dfs(1,0);
	while(M--) {
		int a=read(),b=read(),c=read();ans=INF;
		if(dfn[a]>dfn[b]) std::swap(a,b);
		up(T,1,N,1,N,dfn[a],dfn[b],c);
	}
	for(int i=1;i<N;i++) {
		if(dfn[a[i]]>dfn[b[i]]) std::swap(a[i],b[i]);
		ans=INF;
		int a=q(T,1,N,1,N,1,dfn[b[i]]-1,dfn[b[i]],dfn[b[i]]+siz[b[i]]-1);
		ans=INF;
		int bx=q(T,1,N,1,N,dfn[b[i]],dfn[b[i]]+siz[b[i]]-1,dfn[b[i]]+siz[b[i]],N);
		we(min(a,bx));
	}
	pcc();
}
2022/1/19 08:30
加载中...