社区讨论
树剖+树状数组+二分,样例过了全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 条回复,欢迎继续交流。
正在加载回复...