社区讨论

树剖+树状数组+二分,样例过了全WA

P4116Qtree3参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo1mogjo
此快照首次捕获于
2023/10/22 23:33
2 年前
此快照最后确认于
2023/11/03 00:17
2 年前
查看原帖
CPP
#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

回复

4 条回复,欢迎继续交流。

正在加载回复...