终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了。

对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都是重链中的黑点, 深度就是关键字。

考虑每一种操作


0 : 改变颜色

    在他所在的重链上插入一个黑点或者earse掉

1 : 查询

	就像树链剖分一样, 一直往上跳重链头然后更新答案即可

代码较短

#include <bits/stdc++.h>
#define maxn 101000
#define maxm 303000
using namespace std; template<class T>
inline void read(T &a){
T s = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') {if(c == '-') w = -1; c = getchar();}
while(c >= '0' && c <= '9') {s = (s << 1) + (s << 3) + (c ^ 48); c = getchar();}
a = s*w;
} static int n,q;
static int head[maxn], net[maxm], to[maxm],tot; inline void add(int x, int y){
net[++tot] = head[x], head[x] = tot, to[tot] = y;
} static int dfn[maxn],tid[maxn], fat[maxn], size[maxn], son[maxn], deep[maxn];
static int top[maxn], cnt; set<int> Ans[maxn]; void dfs1(int x, int fa){
size[x] = 1;
son[x] = 0; size[0] = 0;
fat[x] = fa;
// printf("%d\n", x);
for (int i = head[x]; i; i = net[i]){
int v = to[i];
if(v == fa) continue;
deep[v] = deep[x] + 1;
dfs1(v, x);
size[x] += size[v];
if(size[v] > size[son[x]]) son[x] = v;
}
}
void dfs2(int x, int fa, int t){
dfn[++cnt] = x;
//printf("%d %d %d\n", cnt, x, t);
tid[x] = cnt;
top[x] = t;
if(!son[x]) return;
dfs2(son[x], x, t);
for (int i = head[x]; i; i = net[i]){
int v = to[i];
if(v == fa || v == son[x]) continue;
dfs2(v, x, v);
}
} int col[maxn];
int main(){
#ifndef ONLINE_JUDGE
freopen("p4116.in","r", stdin);
freopen("p4116.out","w", stdout);
#endif
read(n); read(q);
// printf("%d\n", n); return 0;
for (int i = 1; i < n; i++){
int x, y;
read(x); read(y);
add(x, y); add(y, x);
}
dfs1(1, 0);
dfs2(1, 0, 1);
for (int i = 1; i <= q; i++){
int opt, x;
read(opt); read(x);
if(opt == 0){
col[x] ^= 1;
if(col[x] == 1) Ans[top[x]].insert(tid[x]);
else Ans[top[x]].erase(tid[x]);
}
else{
int ans = 0x3f3f3f3f;
while(x){
int k = *Ans[top[x]].begin();
if(Ans[top[x]].size())
if(deep[dfn[k]] <= deep[x]) ans = dfn[k];
x = fat[top[x]];
}
printf("%d\n", ans == 0x3f3f3f3f ? -1: ans);
}
}
return 0;
}

[题解]luogu P4116 Qtree3的更多相关文章

  1. luogu P4116 Qtree3

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  2. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  3. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  4. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  5. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...

  6. 题解 Luogu P3370

    讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...

  7. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

  8. P4116 Qtree3

    思路 可以树剖可以LCT,树剖就是每个重链开一个SET维护一下黑点的深度 非常不优美 使用LCT,在splay上二分找出需要的节点即可 代码 #include <cstdio> #incl ...

  9. 洛谷 P4116 Qtree3

    Qtree系列第三题 我是题面 读完题大概不难判断是一道树剖的题 这道题的关键是记录两种状态,以及黑点的序号(不是编号) 线段树啊当然 定义两个变量v,f,v表示距离根节点最近的黑点,默认-1,f则表 ...

随机推荐

  1. Windows Server 2012如何实现双网卡绑定

    在windows server 2012 之前我们在服务器上如果要实现双网卡绑定则需要向服务器厂家所要相应的软件,但是现在强大的windows server 2012的到来使我们省去了所有的麻烦,因为 ...

  2. 2018.10.22 bzoj1742: Grazing on the Run 边跑边吃草(区间dp)

    传送门 区间dp入门题. 可以想到当前吃掉的草一定是一个区间(因为经过的草一定会吃掉). 然后最后一定会停在左端点或者右端点. f[i][j][0/1]f[i][j][0/1]f[i][j][0/1] ...

  3. 2018.09.18 atcoder Many Formulas(搜索)

    传送门 感觉自己搜索能力退化了,这种弱智搜索写了整整5min,这样下去比赛会凉的. 看来得多练练题了. 代码: #include<bits/stdc++.h> #define ll lon ...

  4. java.lang.NoClassDefFoundError Could not initialize class 异常的处理

    class,forname的配置文件出问题核对url数据库中的名字和bean中名字不同没有把jar包变成build path

  5. Robotframework-Appium 之常用API(二)

    续接上一文,更多API详细如下: 注:更多官方详情信息见 http://robotframework.org/robotframework/ 28. Name: Install App Source: ...

  6. Codeforces735D Taxes 2016-12-13 12:14 56人阅读 评论(0) 收藏

    D. Taxes time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  7. C++互斥器:Mutex

    互斥器的功能是,使多个线程和谐工作.同一时间内,只能有一个线程得到互斥对象,并获得资源操作权限,那么如果同一时间其他线程也想去操作资源,此时就会因为Mutex未处于激发状态,而无奈的等待…这时候,线程 ...

  8. RabbitMQ基础入门篇

    下载安装 Erlang RabbitMQ 启动RabbitMQ管理平台插件 DOS下进入到安装目录\sbin,执行以下命令 rabbitmq-plugins enable rabbitmq_manag ...

  9. .net图表之ECharts随笔09-pie环形图表

    这是最后的效果图 1. 这里title属性用到了富文本标签 官方文档是用的label属性,看得我一开始格外的懵逼.后面我尝试着在text中写入格式,没想到竟然成功了. rich中定义样式,在text中 ...

  10. python 返回数组的索引

    使用python里的index nums = [1, 2, 3, 4, 5, 6, 1, 9] print nums.index(max(nums)) print nums.index(1) 该方法同 ...