树剖+树状数组+二分,样例过了全WA
  • 板块P4116 Qtree3
  • 楼主Unknown__
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/30 20:34
  • 上次更新2023/11/3 00:17:22
查看原帖
树剖+树状数组+二分,样例过了全WA
357237
Unknown__楼主2023/8/30 20:34
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> v[200100];
int id[201010],to[201010],dep[201010],root[201010],fa[201010],siz[201010],ze[201010];
int n,m,tot,tree[201010];
bool val[201010];
int lowbit(int x)
{
	return x & (-x);
}
void dfs(int fat,int p,int depth)
{
	dep[p] = depth,siz[p]++,fa[p] = fat;
	for(int i = 0;i < v[p].size();i++)
	{
		int k = v[p][i];
		if(k == fat)continue;
		dfs(p,k,depth + 1);
		siz[p] += siz[k];
		if(siz[ze[p]] < siz[k])ze[p] = k;
	}
}
void bdrt(int fat,int p,int rt)
{
	id[p] = ++tot,to[tot] = p,root[p] = rt;
	if(ze[p])bdrt(p,ze[p],rt);
	for(int i = 0;i < v[p].size();i++)
	{
		int k = v[p][i];
		if(k == fat || k == ze[p])continue;
		bdrt(p,k,k);
	}
}
void modify(int p,int x)
{
	while(p <= n)
	{
		tree[p] += x;
		p += lowbit(p);
	}
}
int query(int p)
{
	int ret = 0;
	while(p)
	{
		ret += tree[p];
		p -= lowbit(p);
	}
	return ret;
}
int find(int l,int r)
{
	while(l < r)
	{
		int mid = l + r >> 1;
		if(query(mid) - query(l - 1) > 0)r = mid;
		else l = mid + 1;
	}
	return val[l] ? l : l + 1;
}
int Tquery(int x1,int x2)
{
	while(root[x1] != root[x2])
	{
		if(dep[root[x1]] < dep[root[x2]])swap(x1,x2);
		if(query(id[x1]) - query(id[root[x1]] - 1) > 0)return find(id[root[x1]],id[x1]);
		else x1 = fa[root[x1]];
	}
	if(dep[x1] > dep[x2])swap(x1,x2);
	if(query(id[x2]) - query(id[x1] - 1) <= 0)return 0;
	else return find(id[x1],id[x2]);
}
int main()
{
	cin>>n>>m;
	int i;
	for(i = 1;i < n;i++)
	{
		int a,b;cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	dfs(0,1,1);
	bdrt(0,1,1);
	to[0] = -1;
	while(m--)
	{
		int op;cin>>op;
		if(!op)
		{
			int p;cin>>p;
			modify(id[p],val[id[p]] == 1 ? -1 : 1);
			val[id[p]] = !val[id[p]];
		}
		else if(op == 1)
		{
			int p;cin>>p;
			cout<<to[Tquery(1,p)]<<endl;
		}
	}
}

rt,谢谢诸位dalao

2023/8/30 20:34
加载中...