RE求助
查看原帖
RE求助
556740
hzx360楼主2024/3/8 17:57

RE on 2#

打了两份都是 RE(悲

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+100,inf=1e9;
bool vis[N];
int n,rt,sum,si[N],mx[N];
int de[N],anc[N][23],dis[N];
struct POSIBLE{int x,y,val;}A[N];int cnt;
int head[N],to[N],ne[N],w[N],tot;
void add(int x,int y,int z){
	ne[++tot]=head[x];
	to[tot]=y,w[tot]=z;
	head[x]=tot;
	return;
}
int LCA(int x,int y){
	if(de[x]<de[y]) swap(x,y);
	for(int i=20;i>=0;i--) if(de[anc[x][i]]>=de[y]) x=anc[x][i];
	if(x==y) return x;
	for(int i=19;i>=0;i--) if(anc[x][i]!=anc[y][i]) x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
void pre_dfs(int u,int fa,int d){
	de[u]=de[fa]+1,anc[u][0]=fa,dis[u]=d;
	for(int i=1;i<=20;i++) anc[u][i]=anc[anc[u][i-1]][i-1];
	for(int i=head[u];i;i=ne[i]) if(to[i]!=fa) pre_dfs(to[i],u,d+w[i]);
	return;
}
void find_rt(int u,int fa){
	si[u]=1,mx[u]=0;
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa or vis[v]) continue;
		find_rt(v,u);
		si[u]+=si[v];
		mx[u]=max(mx[u],si[v]);
	}
	mx[u]=max(mx[u],sum-si[u]);
	if(mx[u]<=mx[rt]) rt=u;
	return;
}
struct node{int id,d;}line[N*5]; int num;
bool cmp(node A,node B){return A.d<B.d;}
void get_dis(int u,int fa,int d){
	++num;
	line[num].id=u,line[num].d=d;
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(vis[v] or v==fa) continue;
		get_dis(v,u,d+w[i]);
	}
	return;
}
set<int>S;
void solve(int u){
	vis[u]=1;
	num=0,get_dis(u,0,0);
	sort(line+1,line+1+num,cmp);
	for(int i=1;i<=num;i++){
		set<int>::iterator it=S.insert(line[i].id).first;
		if(it!=S.begin()){
			set<int>::iterator it1=it;
			it1--;
			A[++cnt]=(POSIBLE){*it1,*it,0};
		}
		set<int>::iterator it2=it;
		it2++;
		if(it2!=S.end()) A[++cnt]=(POSIBLE){*it2,*it,0};
	}
	S.clear();
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(vis[v]) continue;
		sum=si[v],rt=0,mx[rt]=n+1;
		find_rt(v,0);
		solve(rt);
	}
	return;
}
int ci[N];
int lowbit(int x){return x*(-x);}
void add(int x,int y){for(;x;x-=x&-x)ci[x]=min(ci[x],y);}
int ask(int x){int s=inf;for(;x<=n;x+=x&-x)s=min(s,ci[x]);return s;}
struct Question{int l,id;}; vector<Question>qu[N];
struct NODE{int x,y;}; vector<NODE>ve[N];
int ans[N];
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z),add(y,x,z);
	}
	pre_dfs(1,0,0);
	rt=0,mx[rt]=n+1,sum=n;
	find_rt(1,0);
	solve(rt);
	for(int i=1;i<=cnt;i++){
		int lca=LCA(A[i].x,A[i].y);
		A[i].val=dis[A[i].x]+dis[A[i].y]-2*dis[lca];
	}
	for(int i=1;i<=cnt;i++) ve[A[i].y].push_back((NODE){A[i].x,A[i].val});
	int Q;cin>>Q;
	for(int i=1,x,y;i<=Q;i++) scanf("%d%d",&x,&y),qu[y].push_back((Question){x,i});
	for(int i=1;i<=n;i++) ans[i]=inf,ci[i]=inf;
	for(int i=1;i<=n;++i){
			for(auto j:ve[i]) add(j.x,j.y);
			for(auto j:qu[i]) ans[j.id]=ask(j.l);
	}
	for(int i=1;i<=Q;++i) cout<<(ans[i]==inf?-1:ans[i])<<endl;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100,inf=1e9;
bool vis[N];
int n,rt,sum,si[N],mx[N];
int de[N],anc[N][23],dis[N];
struct POSIBLE{int x,y;}A[N];int cnt;
int head[N],to[N],ne[N],w[N],tot;
void add(int x,int y,int z){
	ne[++tot]=head[x];
	to[tot]=y,w[tot]=z;
	head[x]=tot;
	return;
}
int LCA(int x,int y){
	if(de[x]<de[y]) swap(x,y);
	for(int i=19;i>=0;i--) if(de[anc[x][i]]>=de[y]) x=anc[x][i];
	if(x==y) return x;
	for(int i=18;i>=0;i--) if(anc[x][i]!=anc[y][i]) x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
void pre_dfs(int u,int fa,int d){
	de[u]=de[fa]+1,anc[u][0]=fa,dis[u]=d;
	for(int i=1;i<=19;i++) anc[u][i]=anc[anc[u][i-1]][i-1];
	for(int i=head[u];i;i=ne[i]) if(to[i]!=fa) pre_dfs(to[i],u,d+w[i]);
	return;
}
void find_rt(int u,int fa){
	si[u]=1,mx[u]=0;
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa or vis[v]) continue;
		find_rt(v,u);
		si[u]+=si[v];
		mx[u]=max(mx[u],si[v]);
	}
	mx[u]=max(mx[u],sum-si[u]);
	if(mx[u]<=mx[rt]) rt=u;
	return;
}
struct node{int id,d;}line[N*5]; int num;
bool cmp(node A,node B){return A.d<B.d;}
void get_dis(int u,int fa,int d){
	++num;
	line[num].id=u,line[num].d=d;
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(vis[v] or v==fa) continue;
		get_dis(v,u,d+w[i]);
	}
	return;
}
set<int>S;
void solve(int u){
	vis[u]=1;
	num=0,get_dis(u,0,0);
	sort(line+1,line+1+num,cmp);
	for(int i=1;i<=num;i++){
		set<int>::iterator it=S.insert(line[i].id).first;
		if(it!=S.begin()){
			set<int>::iterator it1=it;
			it1--;
			A[++cnt]=(POSIBLE){*it1,*it};
		}
		set<int>::iterator it2=it;
		it2++;
		if(it2!=S.end()) A[++cnt]=(POSIBLE){*it2,*it};
	}
	
//	cout<<u<<": "<<endl;
//	for(int i=bcnt+1;i<=cnt;i++) cout<<A[i].x<<' '<<A[i].y<<endl;
//	cout<<endl;
		
	S.clear();
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(vis[v]) continue;
		sum=si[v],rt=0,mx[rt]=n+1;
		find_rt(v,0);
		solve(rt);
	}
	return;
}
struct Tree_x{int l,r,rt;}tx[N*10]; int all;
struct Tree_y{int ls,rs,mx;}ty[N*10];
void update_y(int &p,int l,int r,int pos,int val){
	if(!p) p=++all;
	if(l==r){
		ty[p].mx=-val;
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid) update_y(ty[p].ls,l,mid,pos,val);
	else update_y(ty[p].rs,mid+1,r,pos,val);
	ty[p].mx=max(ty[ty[p].ls].mx,ty[ty[p].rs].mx);
	return;
}
int query_y(int p,int l,int r,int ql,int qr){
	if(ty[p].mx==-inf) return ty[p].mx;
	if(l==ql and r==qr) return ty[p].mx;
	int mid=(l+r)>>1;
	if(qr<=mid) return query_y(ty[p].ls,l,mid,ql,qr);
	else if(ql>mid) return query_y(ty[p].rs,mid+1,r,ql,qr);
	else return max(query_y(ty[p].ls,l,mid,ql,mid),query_y(ty[p].rs,mid+1,r,mid+1,qr));
}
#define lson p<<1
#define rson p<<1|1 
void build(int p,int l,int r){
	tx[p].l=l,tx[p].r=r;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(lson,l,mid),build(rson,mid+1,r);
	return;
}
void update_x(int p,int posx,int posy,int val){
	update_y(tx[p].rt,1,n,posy,val);
	if(tx[p].l==tx[p].r) return;
	int mid=(tx[p].l+tx[p].r)>>1;
	if(posx<=mid) update_x(lson,posx,posy,val);
	else update_x(rson,posx,posy,val);
	return;
}
int query_x(int p,int ql,int qr,int rl,int rr){
	if(tx[p].l==ql and tx[p].r==qr) return query_y(tx[p].rt,1,n,rl,rr);
	int mid=(tx[p].l+tx[p].r)>>1;
	if(qr<=mid) return query_x(lson,ql,qr,rl,rr);
	else if(ql>mid) return query_x(rson,ql,qr,rl,rr);
	else return max(query_x(lson,ql,mid,rl,rr),query_x(rson,mid+1,qr,rl,rr));
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z),add(y,x,z);
	}
	pre_dfs(1,0,0);
	rt=0,mx[rt]=n+1,sum=n;
	find_rt(1,0);
	solve(rt);
	build(1,1,n);
	for(int i=0;i<=(n+cnt)*15;i++) ty[i].mx=-inf;
//	cout<<endl;
	for(int i=1;i<=cnt;i++){
		int lca=LCA(A[i].x,A[i].y);
		update_x(1,A[i].x,A[i].y,dis[A[i].x]+dis[A[i].y]-2*dis[lca]);
//		cout<<A[i].x<<' '<<A[i].y<<' '<<dis[A[i].x]+dis[A[i].y]-2*dis[lca]<<endl;
	}
	int Q;cin>>Q;
	while(Q--){
		int L,R;
		scanf("%d%d",&L,&R);
		int ans=query_x(1,L,R,L,R);
		if(ans==-inf) puts("-1");
		else cout<<-ans<<endl;
	} 
	return 0;
}
2024/3/8 17:57
加载中...