\(\color{#0066ff}{ 题目描述 }\)

  1. 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点。一种叫做SHOI 的神经组织因为其和近日发现的化合物 SHTSC 的密切联系引起了人们的极大关注。

    SHOI 组织由若干个 SHOI 细胞构成,SHOI 细胞之间形成严密的树形结构。每个 SHOI 细胞都有且只有一个输出端,被称为轴突,除了一个特殊的、被称为根细胞的 SHOI 细胞的输出作为整个组织的输出以外,其余细胞的轴突均连向其上级 SHOI 细胞;并且有且只有三个接收端,被称为树突,从其下级细胞或者其它神经组织那里接收信息。SHOI 细胞的信号机制较为简单,仅有 \(0\)和 \(1\)两种。每个 SHOI 细胞根据三个输入端中 \(0\)和 \(1\)信号的多寡输出较多的那一种。

    现在给出了一段 SHOI 组织的信息,以及外部神经组织的输入变化情况。请你模拟 SHOI 组织的输出结果。

\(\color{#0066ff}{输入格式}\)

  1. 输入的第一行包含一个整数 \(n\)。表示 SHOI 组织的总细胞个数。SHOI 细胞由 \(1\)~ \(n\) 编号,编号为 \(1\) 的是根细胞。

    从第二行开始的 \(n\)行,每行三个整数 \(x_1, x_2, x_3\),分别表示编号为 \(1\)~ \(n\) 的 SHOI 细胞的树突连接。\(1 < x_i \leq n\) 表示连向编号为 \(x_i\) 的细胞的轴突, \(n < x_i \leq 3n+1\) 表示连向编号为 \(x_i\) 的外界输入。输入数据保证给出的 SHOI 组织是合法的,且所有的 \(x_i\) 两两不同。

    接下来一行包含 \(2n+1\) 个 \(0/1\) 的整数,表示初始时的外界输入。

    第 \(n+3\)行有一个整数 \(q\),表示总操作数。

    之后 \(q\) 行每行一个整数 \(x\),表示编号为 \(x\) 的外界输入发生了变化。

\(\color{#0066ff}{输出格式}\)

输出 \(q\) 行,每行一个整数,对应第 \(i\) 次外界输入变化后的根细胞的输出。

\(\color{#0066ff}{输入样例}\)

  1. 3
  2. 2 3 4
  3. 5 6 7
  4. 8 9 10
  5. 0 0 0 0 1 1 1
  6. 5
  7. 4
  8. 4
  9. 5
  10. 6
  11. 8

\(\color{#0066ff}{输出样例}\)

  1. 1
  2. 0
  3. 0
  4. 1
  5. 1

\(\color{#0066ff}{数据范围与提示}\)

对于 \(10 \%\)的数据, \(n \leq 1000, q \leq 1000\)。

对于 \(30 \%\)的数据, \(n \leq 100000, q \leq 100000\)。

对于 \(100 \%\)的数据, \(n \leq 500000, q \leq 500000\)。

\(\color{#0066ff}{ 题解 }\)

这毒瘤题读了半天没看懂啥意思,现在简单概括一下题意

给你一颗三叉树(类比二叉树qwq),1为根,前n个点每个点有三个孩子,\(n+1\to3n\)这些点为叶子节点,然后给你所有叶子的权值0/1,定义\(1-n\)点的权值为,三个孩子中权为1的孩子的个数是否大于1,如果是则权值为1,否则为0。现在给你一些操作,每次让一个叶子的权值异或1,每次操作输出根的权值

我们考虑每次操作对答案的影响,设\(v_i\)为i有多少个权值为1的孩子\(v_i\in [0,3]\)

如果当前点权值由0变1,那么什么情况下父亲的权值也会改变呢

显然当且仅当父亲的v=1,那么加上自己的改变, 父亲的v变为2,这时父亲的权值也从原来的0变为1,这就是一个子问题了

同理,如果是1变0, 当且仅当父亲的v=2时父亲也会改变

那么,我们可以得到一个结论,每次修改一个点产生的影响是从这个点向上一条连续v为1或2的链的权值的改变,只要这个链包括了1, 答案就会改变

那么现在的问题是,怎么快速维护这个东西,我们需要快速找到一个点向上延伸1/2的最上面那个点,还有一条链的权值的修改

可以用LCT维护这个东西, 显然不需要makeroot操作,那么翻转标记就没用了

每个点维护两个点的指针,一个是最深的v!=1的点,一个是最深的v!=2的点

这个点实际上就是延伸的链顶的父亲

为什么要最深? 因为要保证下面的1/2连续

怎么维护? 因为要最深,所以在splay上,先考虑右儿子,然后是自己,最后是左儿子

如果这个点存在,那么就对答案没有影响(仔细想想),我们把这个点转上去,那么实际上就是当前点的单点修改,右子树整体的修改,这个打标记即可,注意v改变了,n1和n2要互换!

如果不存在呢,说明此链一直延伸到根,那么直接对整个splay打标记,并把答案修改即可

这题就没了。。。

发现实际上每个点的权值就是\(\frac v 2\),所以直接维护v就行了

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. LL in() {
  4. char ch; LL x = 0, f = 1;
  5. while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
  6. for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
  7. return x * f;
  8. }
  9. const int maxn = 5e5 + 3;
  10. const int maxm = 1.5e6 + 3;
  11. struct node {
  12. node *ch[2], *fa, *n1, *n2;
  13. int val, tag;
  14. node(int val = 0, int tag = 0): val(val), tag(tag) {
  15. ch[0] = ch[1] = fa = n1 = n2 = NULL;
  16. }
  17. void trn() { std::swap(n1, n2); val ^= 3; tag ^= 1; }
  18. void dwn() {
  19. if(!tag) return;
  20. if(ch[0]) ch[0]->trn();
  21. if(ch[1]) ch[1]->trn();
  22. tag = 0;
  23. }
  24. void upd() {
  25. n1 = n2 = NULL; //这行不能少!
  26. //右根左这样找
  27. if(ch[1]) n1 = ch[1]->n1;
  28. if(!n1) n1 = this->val == 1? NULL : this;
  29. if(ch[0] && !n1) n1 = ch[0]->n1;
  30. if(ch[1]) n2 = ch[1]->n2;
  31. if(!n2) n2 = this->val == 2? NULL : this;
  32. if(ch[0] && !n2) n2 = ch[0]->n2;
  33. }
  34. bool isr() { return this == fa->ch[1]; }
  35. bool ntr() { return fa && (fa->ch[1] == this || fa->ch[0] == this); }
  36. }pool[maxn];
  37. int fa[maxm], val[maxm], du[maxm];
  38. int n, ans;
  39. void toposort() {
  40. std::queue<int> q;
  41. for(int i = n + 1; i <= 3 * n + 1; i++) val[i] = in() << 1, q.push(i);
  42. while(!q.empty()) {
  43. int tp = q.front(); q.pop();
  44. if(tp <= n) pool[tp].upd(), pool[tp].fa = pool + fa[tp];
  45. pool[fa[tp]].val += (tp > n? val[tp] : pool[tp].val) >> 1;
  46. du[fa[tp]]--;
  47. if(!du[fa[tp]]) q.push(fa[tp]);
  48. }
  49. pool[1].fa = NULL;
  50. }
  51. void rot(node *x) {
  52. node *y = x->fa, *z = y->fa;
  53. bool k = x->isr(); node *w = x->ch[!k];
  54. if(y->ntr()) z->ch[y->isr()] = x;
  55. (x->ch[!k] = y)->ch[k] = w;
  56. (y->fa = x)->fa = z;
  57. if(w) w->fa = y;
  58. y->upd(), x->upd();
  59. }
  60. void splay(node *o) {
  61. static node *st[maxn];
  62. int top;
  63. st[top = 1] = o;
  64. while(st[top]->ntr()) st[top + 1] = st[top]->fa, top++;
  65. while(top) st[top--]->dwn();
  66. while(o->ntr()) {
  67. if(o->fa->ntr()) rot(o->isr() ^ o->fa->isr()? o : o->fa);
  68. rot(o);
  69. }
  70. }
  71. void access(node *x) {
  72. for(node *y = NULL; x; x = (y = x)->fa)
  73. splay(x), x->ch[1] = y, x->upd();
  74. }
  75. int main() {
  76. n = in();
  77. for(int i = 1; i <= n; i++) du[fa[in()] = fa[in()] = fa[in()] = i] = 3;
  78. toposort();//求初始的答案
  79. ans = pool[1].val >> 1;
  80. int x, tp;
  81. for(int T = in(); T --> 0;) {
  82. tp = (val[x = in()] ^= 2) >> 1;
  83. access(pool + (x = fa[x])), splay(pool + x);
  84. node *o = pool + x;
  85. node *nr = tp? o->n1 : o->n2; //找最深的点
  86. if(nr) {
  87. splay(nr);
  88. if(nr->ch[1]) nr->ch[1]->trn(), nr->ch[1]->upd();
  89. nr->val += tp? 1 : -1;
  90. nr->upd();
  91. }
  92. else ans ^= 1, o->trn(), o->upd();
  93. printf("%d\n", ans);
  94. }
  95. return 0;
  96. }

P4332 [SHOI2014]三叉神经树的更多相关文章

  1. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  2. P4332 [SHOI2014]三叉神经树(LCT)

    Luogu4332 LOJ2187 题解 代码-Tea 题意 : 每个点有三个儿子 , 给定叶节点的权值\(0\)或\(1\)且支持修改 , 非叶子节点的权值为当有\(>=2\)个儿子的权值为\ ...

  3. 洛谷P4332 [SHOI2014]三叉神经树(LCT)

    传送门 FlashHu大佬太强啦%%% 首先,我们可以根据每一个点的权值为$1$的儿子的个数把每个点记为$0~3$,表示这一个点的点权 先考虑一下暴力的过程,假设从$0$变为$1$,先更改一个叶子结点 ...

  4. [BZOJ 3553][SHOI2014]三叉神经树

    传送门(下面也有题面) 题目大意: 一颗有根树,每个非叶子节点都有三个子节点,每个节点的权为0/1. 每个节点的权 取决于其所有子节点中 哪种权出现的次数更多. 有若干次询问,每次询问修改一个叶子节点 ...

  5. BZOJ3553 : [Shoi2014]三叉神经树

    设val[i]为i连出去的树突中输出值为0的个数 如果val[x]<=1,输出值为1,否则输出值为0 修改x就相当于val[f[i]]++或者val[f[i]]-- 用Link-cut Tree ...

  6. 3553: [Shoi2014]三叉神经树(树链剖分)

    这道题特别恶心,首先我们可以发现更改的就是出现连续的一或二,那么就用线段树+树链剖分找到这个范围 想到是不难想,就是打起来恶心罢了= = CODE: #include<cstdio> #i ...

  7. [SHOI2014]三叉神经树

    题目描述 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物 SHTSC 的密切联系引起了人们的极大关注. SHOI 组织由若干个 SHOI ...

  8. BZOJ 3553: [Shoi2014]三叉神经树 LCT

    犯傻了,想到了如果是 0->1 的话就找最深的非 1 编号,是 1 -> 0 的话就找最深的非 0 编号. 但是没有想到这个东西可以直接维护. 假设不考虑叶子节点,那么如果当前点的值是 1 ...

  9. 洛谷4322 SHOI2014 三叉神经树(LCT+思维)

    好久之前做的题了QWQ 现在来补一发博客 一道神仙题啊..qwq 首先,我们可以看出来,我们如果对于每个点维护一个\(val\),表示他的直系儿子中有几个表现为1的. 那么\(val[x]>&g ...

随机推荐

  1. java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

    转自:https://blog.csdn.net/iteye_17476/article/details/82651580 java.lang.ClassCastException: org.apac ...

  2. LAMP 2.5 Apache禁止解析php

    某个目录下禁止解析 php,这个很有用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件, 为了避免上传的文件有木马, 所以我们禁止这个目录下面的访问解析 php. 安装目录下有个data ...

  3. 用java代码解决10元喝多少瓶汽水的问题

    问题:汽水2元一瓶,四个盖子换一瓶,两个空瓶一瓶,问10元可以喝几瓶?(不许借别人空瓶或瓶盖,但可以先喝汽水再付空酒瓶或瓶盖) 最近同事让笔者看了一道脑筋急转弯的数学题,当然不是很难,只要会加减法应该 ...

  4. 用JS,打印99乘法表

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. solr增量数据配置说明

    转帖地址:http://www.blogjava.net/conans/articles/379546.html 以下资料整理自网络,觉的有必要合并在一起,这样方便查看.主要分为两部分,第一部分是对& ...

  6. unity3d MonoDevelop引用外部自定义dll文件报错:are you missing an assembly reference?

    在unity3d 编辑器 MonoDevelop 中引用外部自定义dll文件报错:are you missing an assembly reference? 因为unity还停留在.NET Fram ...

  7. 存储前set方法相互关联 只关联了一方 分别set

    17:51:45,580 ERROR SqlExceptionHelper:129 - Column 'lkm_cust_id' cannot be nullorg.hibernate.excepti ...

  8. MSER

    1.注释很全的分析:http://blog.csdn.net/zhaocj/article/details/40742191 2.opencv采用的mser实现方法 * 1. the gray ima ...

  9. mongodb3.0版本的2种引擎对比

    mongodb3.0以后 增加了wiredtiger引擎.常规引擎也升级到MMAPv1引擎(MongoDB2.6及以下版本用的是MMAP引擎):   mmapv1引擎:             col ...

  10. R: 正则表达式

    正则表达式: 例:sub("a","",c("abcd","dcba")):   [1] "bcd" ...