正题


题目大意

一棵树,开始全是白点,两个操作

  1. 将一个节点翻转
  2. 询问一颗棋子与所有面朝上为黑色的棋子lca最深的那个的编号

解题思路

必备技能:平衡树(或set库的使用方法),大量卡常技巧,LCA

我们可以发现和一个点的lca最深的话,这个点一定是在dfs序上最近的点,这时候我们就要使用平衡树了。
每多一个黑点就将dfs序加入平衡树,删除就去掉。然后询问一个点的时候就在平衡树上查询离他dfs最近的一个黑点,然后求LCA。
这里就不敲平衡树了,反正set也行

不过直接用dfs会爆炸,所以要用奇特的方法计算dfs序。


code

注意:以下代码包含大量卡常操作,如果对您的眼睛造成了伤害那我表示道歉。

#pragma GCC optimize("O2")
#include<cstdio>
#include<algorithm>
#include<set>
#include<cmath>
#include<queue>
#include<cctype>
#define N 800010
using namespace std;
struct line{int to,next,w;
}a[N];
int tot,n,m,x,y,ls[N],dep[N],t,cnt,T,que[N];
int dfn[N],put[N],f[N][24],dis[N][24],siz[N];
set<int> s;
queue<int> q;
__attribute__((optimize("O3"))) inline int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}
__attribute__((optimize("O3"))) inline void addl(int x,int y)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
__attribute__((optimize("O3"))) void dfs()//求dfs序
{int h=0,t=1;que[++h]=1;dfn[1]=1; put[dfn[1]]=1;while(h<=t) {int x=que[h++],last=x;for(register int i=ls[x];i;i=a[i].next){int y=a[i].to;dfn[y]=dfn[last]+(last!=x?siz[last]:1);put[dfn[y]]=y;que[++t]=y;last=y;}}
}
__attribute__((optimize("O3"))) void bfs(int s)//预处理LCA
{int h=0,t=1;que[++h]=1;while(h<=t) {int x=que[h++];siz[x]=1;for(register int i=ls[x];i;i=a[i].next) {int y=a[i].to;dep[y]=dep[x]+1,f[y][0]=x;que[++t]=y;}}for(register int i=n;i>=1;i--)siz[f[que[i]][0]]+=siz[que[i]];T=(int)(log(n)/log(2))+1;for (int j=1;j<=T;j++){for (int i=1;i<=n;i++){f[i][j]=f[f[i][j-1]][j-1];dis[i][j]=min(dis[i][j-1],dis[f[i][j-1]][j-1]);}}cnt=0;
}
__attribute__((optimize("O3"))) int LCA(int x,int y)//求LCA
{if (dep[x]>dep[y]) swap(x,y);for (int i=T;i>=0;i--)if (dep[f[y][i]]>=dep[x]) y=f[y][i];if (x==y) return x;for (int i=T;i>=0;i--)if (f[y][i]!=f[x][i]) {x=f[x][i];y=f[y][i];}return f[x][0];
}
__attribute__((optimize("O3"))) void print(int x){if (x>9) print(x/10); putchar(x%10+48); return;
}
__attribute__((optimize("O3"))) signed main()
{n=read();m=read();for(register int i=2;i<=n;i++){addl(read(),i);}bfs(1);dfs();dep[0]=-1;for(register int i=1;i<=m;i++){x=read();if(x>0){if(!s.insert(dfn[x]).second) s.erase(dfn[x]);//加点or去点}else{x=abs(x);int t1=0,t2=0;set<int>::iterator y=s.lower_bound(dfn[x]);if(y!=s.end()) t1=LCA(x,put[*y]);if(y!=s.begin()) y--,t2=LCA(x,put[*y]);if(dep[t1]<dep[t2]) print(t2),putchar('\n');else print(t1),putchar('\n');}//求最近的}
}

nssl1164-观察【平衡树,LCA】相关推荐

  1. ssl提高组周六模拟赛【2018.9.23】

    前言 我ssl模拟式爆炸了,我已经打算从1楼跳下去了 成绩 因为比赛的时候数据出bug,所以排名有些奇怪,就不放了. 正题 T1:nssl1162−T1:nssl1162-T1:nssl1162−农夫 ...

  2. 举步维艰——回顾CSP2020

    举步维艰--回顾CSP2020 复出 7.20 上一年 CSP-J 水过一等奖之后真丢人 ,转身跳进文化课,结果中考还是炸裂,自主招生也没有过,只有综能保底进了 SMMS . 7.25~7.30 参加 ...

  3. [2020-11-28 contest]素数(数学),精灵(区间dp),农夫约的假期(结论),观察(树链剖分lca+set)

    文章目录 素数 solution code 精灵 solution code 农夫约的假期 solution code 观察 solution solution code 素数 solution 通过 ...

  4. Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”

    作者 | Janice Lan,Rosanne Liu等 译者 | 清儿爸 责编 | 夕颜 出品 | AI科技大本营(ID: rgznai100) [导读]神经网络(Neural networks,N ...

  5. 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...

  6. BZOJ 3626: [LNOI2014]LCA

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2074  Solved: 828 [Submit][Stat ...

  7. PAT (Advanced Level) 1140~1143:1140模拟 1141模拟 1142暴力 1143 BST+LCA

    1140 Look-and-say Sequence(20 分) 题意:观察序列D, D1, D111, D113, D11231, D112213111, ...,显然后一个串是对前一个串每一小段连 ...

  8. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  9. NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】

    题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn个 ...

最新文章

  1. HDU 1711 Number Sequence(KMP算法)
  2. jquery拖拽实现UI设计组件
  3. 设计模式六大原则(6)——开闭原则
  4. clamp mnn不支持
  5. 大爱jQuery,10美女模特有用jQuery/CSS3插入(集成点免费下载)
  6. win10 下pycharm+anaconda 编译生成pyd文件
  7. JavaScript-获得和设置表单的值
  8. Pandas to_bool
  9. 《并行计算的编程模型》一2.3.2 段信息
  10. java map clone,map.putall()和map.clone()方法有什么区别?
  11. html5 sessionStorage 与 localStorage存储
  12. 手机运行慢可以刷机吗_为什么手机卡顿,反应变慢怎么解决?一定要刷机吗?...
  13. Moodle安装指导手册
  14. oa工作任务管理系统设计
  15. php配置北京时间,php如何设置北京时间_后端开发
  16. ST-GCN demo运行记录
  17. 如何轻松搞定 笔记本搜不到WIFI信号问题
  18. 读《沃伦巴菲特》有感----成功是不可以复制的。
  19. 剥开ios 系统sandbox神秘面纱
  20. 马云:不能把孩子放在温室里 光给孩子知识是不够的

热门文章

  1. U盘安装Linux挂载cd,U盘安装Ubuntu Server CD-ROM挂载失败
  2. c语言 gbk字模点阵数组,GBK点阵显示字库的制作和使用
  3. java的正则表达式 CPU_小心踩雷!一个小小的正则表达式竟把CPU拖垮......
  4. 利用vector实现一对一(pair<int,int>)
  5. Java中关于单核处理多个线程的认识与了解
  6. 7-4 二叉树的遍历!(简单) (25 分)
  7. [JavaWeb-CSS]CSS概述
  8. [剑指offer]面试题23:从上往下打印二叉树
  9. 辅助类BinaryTreeNode(二叉树节点)
  10. #6278. 数列分块 2 分块 + 块内二分