当前位置: 首页 > news >正文

<<P4116 Qtree3>>

题目描述

给出 N 个点的一棵树(N−1 条边),节点有白有黑,初始全为白。

有两种操作:

0 i:改变某点的颜色(原来是黑的变白,原来是白的变黑)。

1 v:询问 1 到 v 的路径上的第一个黑点,若无,输出 −1。

输入格式

第一行 N,Q,表示 N 个点和 Q 个操作。

第二行到第 N 行 N−1 条无向边。

再之后 Q 行,每行一个操作 0 i 或者 1 v

输出格式

对每个 1 v 操作输出结果

输入输出样例

输入 #1复制

9 8
1 2
1 3
2 4
2 9
5 9
7 9
8 9
6 8
1 3
0 8
1 6
1 7
0 2
1 9
0 2
1 9 

输出 #1复制

-1
8
-1
2
-1

说明/提示

对于 1/3 的数据有 N=5000,Q=400000。

对于 1/3 的数据有 N=10000,Q=300000。

对于 1/3 的数据有 N=100000,Q=100000。

此外,有1≤i,v≤N。

代码实现:

#include<cstdio>
#include<algorithm>
#include<cctype>
#include<set>

using namespace std;

#define INF 1000000000
#define pprint(x) print(x),putchar(' ')
#define fprint(x) print(x),putchar('\n')

char BB[1 << 15],*SS = BB,*TT = BB;
inline long long read()
{
long long val = 0;int sign = 1;
char ch = getchar();
for(;!isdigit(ch);ch = getchar())
if(ch == '-')
sign = -1;
for(;isdigit(ch);ch = getchar())
val = val * 10 + (ch ^ 48);
return val * sign;
}
void print(long long num)
{
if(num < 0)
putchar('-'),num = -num;
if(num > 9)
print(num / 10);
putchar(num % 10 + '0');
}

const int N = 100010;

int depth[N];
struct TreePartition
{
struct Edge
{
int next,to;
}edges[N << 1];
int head[N],edgeCount;
void add(int from,int to)
{
edges[++edgeCount].to = to,edges[edgeCount].next = head[from];
head[from] = edgeCount;
}
void addEdge(int from,int to)
{
add(from,to),add(to,from);
}
int color[N],father[N],size[N],heavySon[N],chainTop[N];
struct Compare{bool operator()(const int &a,const int &b){ return depth[a] < depth[b]; }};
set<int,Compare> nodes[N];
void dfs1(int node,int parent)
{
father[node] = parent,depth[node] = depth[parent] + 1,size[node] = 1;
heavySon[node] = 0;
for(int i = head[node];i;i = edges[i].next)
{
int neighbor = edges[i].to;
if(neighbor == parent)
continue;
dfs1(neighbor,node);
size[node] += size[neighbor];
if(size[neighbor] > size[heavySon[node]])
heavySon[node] = neighbor;
}
}
void dfs2(int node,int top)
{
chainTop[node] = top;
if(!heavySon[node])
return;
dfs2(heavySon[node],top);
for(int i = head[node];i;i = edges[i].next)
{
int neighbor = edges[i].to;
if(neighbor == father[node] || neighbor == heavySon[node])
continue;
dfs2(neighbor,neighbor);
}
}
void toggle(int node)
{
if(color[node] ^= 1)
nodes[chainTop[node]].insert(node);
else
nodes[chainTop[node]].erase(node);
}
int query(int node)
{
int result = -1;
while(node)
{
int candidate = *nodes[chainTop[node]].begin();
if(nodes[chainTop[node]].size())
if(depth[candidate] <= depth[node])
result = candidate;
node = father[chainTop[node]];
}
return result;
}
void initialize()
{
dfs1(1,0);
dfs2(1,1);
}
}tree;

int main()
{
int nodeCount = read(),queryCount = read();
for(int i = 1;i < nodeCount;i++)
tree.addEdge(read(),read());
tree.initialize();
while(queryCount--)
{
int operation = read();
if(!operation)
tree.toggle(read());
else
fprint(tree.query(read()));
}
return 0;
}

http://www.dtcms.com/a/296163.html

相关文章:

  • 胡良兵Nature Chem Eng:孔隙门控焦耳热精准升级聚乙烯为航油前驱物
  • 中央广播电视总台联合阿里云研究院权威发布《中国人工智能应用发展报告(2025)》:我国依旧需要大力注重人工智能人才的培养
  • Coze工作流-更多图像插件
  • 数据集成难在哪?制造企业该怎么做?
  • Docker多主机网络连接:实现跨主机通信
  • 主流摄像头协议及其开源情况,GB/T 28181协议介绍
  • 配电自动化终端中电源模块的设计
  • uniapp中flex布局gap属性兼容处理
  • PH73211L_VC1/PH73211LQ_VC1:低功耗USB HiFi音频解码器固件技术解析
  • QML WorkerScript
  • 【Spring Boot】热部署终极指南:IDEA高效配置与JRebel替代方案深度解析
  • 第4章唯一ID生成器——4.1 分布式唯一ID
  • Vimba相机二次开发教程,基于Python
  • R 语言科研配色 --- 第 81 期 (附免费下载的配色绘图PPT)
  • 【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程
  • 重生学AI第二十集(大结局):完善模型以及学习总结
  • 【STM32】FreeRTOS 任务的删除(三)
  • NX804NX810美光固态闪存NX815NX839
  • 人形机器人双足行走动力学:K-V模型其肌腱特性拟合中的应用
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型通过YoloV8深度学习模型实现工人安全装备(安全帽、手套、马甲等)检测识别 (C#)
  • C++高效实现轨迹规划、自动泊车、RTS游戏、战术迂回包抄、空中轨迹、手术机器人、KD树
  • 408——数据结构(第二章 线性表)
  • IPSec VPN -- 野蛮模式
  • windows11新建文件夹重命名时总是出现加载界面卡死状态
  • javaweb面试
  • 数据结构实验-查找与排序算法
  • 游戏开发Unity/ ShaderLab学习路径
  • 【独立工具】小红书图片采集软件
  • ExoCode.ino - OpenExo
  • Lua(文件I/O)