(坑)动态点分治学习笔记 & luogu P2056 [ZJOI2007]捉迷藏 & P4115 Qtree4 & SP2666 QTREE4 - Query on a tree IV

太难打了…
先弃掉

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define INF (int)(1e9)
using namespace std;
priority_queue<int> fl,f2,f3;//f1:到当前根的距离,f2:儿子的f1的值,f3:f2的最大值与次大值之和
	int n,m,len=0,cnt;//cnt:当前关灯的数目 
	int last[200010],size[200010],msize[200010],dis[200010],sum[200010],f[200010][25],dep[200010],fa[200010];
	bool state[200010],bz[200010];
	struct node{int x,y,next;} a[200010];
int SIZE,ROOT,FA;
void ins(int x,int y)
{
	a[++len]=(node){x,y,last[x]}; last[x]=len;
}
void init()
{
	for(int i=1;i<=20;i++)
		for(int j=1;j<=n;j++)
			f[j][i]=f[f[j][i-1]][i-1];
}
int op=0;
void dfs_pre(int x,int fa)
{
	for(int i=last[x];i;i=a[i].next)
	{
		int y=a[i].y;
		if(y==fa) continue;
		f[y][0]=x;
		dep[y]=dep[x]+1;
		dfs_pre(y,x);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;i--)
		if(dep[y]<=dep[f[x][i]]) x=f[x][i];
	if(x==y) return x;
	for(int i=20;i>=0;i--)
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
void find_root(int x,int fa)
{
	size[x]=1;
	msize[x]=0;
	for(int i=last[x];i;i=a[i].next)
	{
		int y=a[i].y;
		if(y==fa||bz[y]) continue;
		find_root(y,x);
		size[x]+=size[y];
		msize[x]=max(msize[x],size[y]);
	}
	msize[x]=max(msize[x],SIZE-size[x]);
	if(msize[ROOT]>msize[x]) ROOT=x;
}
void dfs_div(int x,int fa)
{
	Fa[x]=fa;
	for(int i=last[x];i;i=a[i].next)
	{
		int y=a[i].y;
		dfs2();
	}
}
int main()
{
	char s[5];
	int x,y;
	scanf("%d",&n);
	cnt=n;
	for(int i=1;i<n;i++)
	{
		scanf("%d %d",&x,&y);
		ins(x,y),ins(y,x);
	}
	dfs_pre(1,0);
	init();
	SIZE=0,msize[0]=INF,ROOT=0;
	find_root(1,0);
	dfs_div(ROOT,0);
	scanf("%d",&m);
//	for(int i=1;i<=m;i++)
//	{
//		scanf("%s",s+1);
//		if(s[1]=='C')
//		{
//			scanf("%d",&x);
//			if(state[x]) cnt++,close(x); else cnt--,turn(x);
//			state[x]^=1;
//			
//		} else printf("%d\n",cnt<2?cht-1:f3.top());
//	}
}

猜你喜欢

转载自blog.csdn.net/zsyz_ZZY/article/details/89301787