超短90分WA#13#16 小清新生成树+树剖求调
查看原帖
超短90分WA#13#16 小清新生成树+树剖求调
359845
岂非楼主2022/7/28 21:34

WA On#13:Wrong Answer.wrong answer On line 10791 column 2, read 9, expected 8.

WA On#16:Wrong Answer.wrong answer On line 19156 column 2, read 5, expected 4.

之前暴力逐层跳父亲已经A过了,不知道为啥写树剖就寄了

#include <cstdio>
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <unordered_map>
#define ll long long
using namespace std;
int n,m,bcj1[10010],q,dep[10010],vis[10010],son[10010],f[10010],dfn[10010],fdf[10010],big[10010],cnt,x,y,qz[10010],f1[10010],to[10010];
vector <pair<int,int> > ve1[10010];
vector <int> root;
/*Segment Tree*/
struct Node{
	int l,r,mid;
	int sum,tag1,minn;
	Node *lson,*rson;
}*head;
Node *build(int l,int r){
	Node *p=new(Node);
	p->l=l;p->r=r;p->mid=(l+r)>>1;p->tag1=0;
	if(l==r){
		p->sum=p->minn=qz[fdf[l]];return p;
	}
	p->lson=build(l,p->mid);
	p->rson=build(p->mid+1,r);
	p->sum=p->lson->sum+p->rson->sum;
	p->minn=min(p->lson->minn,p->rson->minn);
	return p;
}
int query(int x,int y,Node *p){
	if(x<=p->l&&p->r<=y){
		return p->minn;
	}
	int res=0x7fffffff;
	if(x<=p->mid){
		res=min(res,query(x,y,p->lson));
	}
	if(y>p->mid){
		res=min(res,query(x,y,p->rson));
	}
	return res;
}
/*Segment Tree*/
struct edge{
	int x,y,z;
}e[50010];
bool cmp1(edge x,edge y){
	return x.z>y.z;
}
int ff0(int x){
	if(bcj1[x]==x) return x;
	return bcj1[x]=ff0(bcj1[x]);
}
inline void kru(){
	int f1,f2;
	for(int i=1;i<=m;i++){
		f1=ff0(e[i].x);
		f2=ff0(e[i].y);
		if(f1!=f2){
			ve1[e[i].x].push_back(make_pair(e[i].y,e[i].z));
			ve1[e[i].y].push_back(make_pair(e[i].x,e[i].z));
			bcj1[f1]=f2;
		}
	}
}
inline void liantong(){
/*	int lstf=ff0(1),tmp;
	root.push_back(1);
	for(int i=2;i<=n;i++){
		tmp=ff0(i);
		if(tmp!=lstf){
			lstf=tmp;
			root.push_back(i);
		}
	}*/
	for(int i=1;i<=n;i++){
		if(to[ff0(i)]==0){
			root.push_back(i);
			to[ff0(i)]=1;
		}
	}
}
void dfs1(int nod,int dp){
	dep[nod]=dp;son[nod]=1;
	int tmax=0,tb=0;
	for(int i=0;i<ve1[nod].size();i++){
		if(vis[ve1[nod][i].first]==0){
			vis[ve1[nod][i].first]=1;
			dfs1(ve1[nod][i].first,dp+1);
			qz[ve1[nod][i].first]=ve1[nod][i].second;
			f1[ve1[nod][i].first]=nod;
			son[nod]+=son[ve1[nod][i].first];
			if(son[ve1[nod][i].first]>tmax){
				tb=ve1[nod][i].first;tmax=son[ve1[nod][i].first];
			}
		}
	}
	big[nod]=tb;
}
void dfs2(int nod,int ld){
	f[nod]=ld;dfn[nod]=++cnt;fdf[cnt]=nod;
	if(big[nod]){
		vis[big[nod]]=1;
		dfs2(big[nod],ld);
	}
	for(int i=0;i<ve1[nod].size();i++){
		if(vis[ve1[nod][i].first]==0){
			vis[ve1[nod][i].first]=1;
			dfs2(ve1[nod][i].first,ve1[nod][i].first);
		}
	}
}
int lca(int x,int y){
	int res=0x7fffffff;
	while(f[x]!=f[y]){
		if(dep[f[x]]<dep[f[y]])swap(x,y);
		res=min(res,query(dfn[f[x]],dfn[x],head));
		x=f1[f[x]];
/*		if(x==0){
			res=min(res,query(dfn[f[y]],dfn[y],head));return res;
		}*/
	}
	if(x==y) return res; 
	if(dep[x]>dep[y]) swap(x,y);
	res=min(res,query(dfn[big[x]],dfn[y],head));
	return res;
}
signed main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
	}
	for(int i=1;i<=n;i++){
		bcj1[i]=i;
	}
	sort(e+1,e+1+m,cmp1);
	kru();
	liantong();
	for(int i=0;i<root.size();i++){
		vis[root[i]]=1;
		dfs1(root[i],1);
	}
	for(int i=1;i<=n;i++){
		vis[i]=0;
	}
	for(int i=0;i<root.size();i++){
		vis[root[i]]=1;
		dfs2(root[i],root[i]);
		qz[dfn[root[i]]]=0x7fffffff;
	}
	head=build(1,cnt);
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		scanf("%d%d",&x,&y);
		if(ff0(x)!=ff0(y)){
			puts("-1");continue;
		}
		printf("%d\n",lca(x,y));
	}
	return 0;
}
2022/7/28 21:34
加载中...