nssl1164-观察【平衡树,LCA】

正题


题目大意

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

  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');}//求最近的}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开封游(一)

今天去开封玩了一下&#xff0c;白天在路程上耽搁太多时间&#xff0c;主要在晚上玩的。终于到显示我米9夜景功能的时候了。 去了包公祠&#xff0c;西司夜市&#xff0c;鼓楼夜市。 下午先去了包公祠 下面是夜景了&#xff0c;特别的炫酷。 首先是西司夜市 进去的时候 这个…

C#中的两把双刃剑:抽象类和接口

问题出现&#xff1a;我们在使用C#的抽象类和接口的时候&#xff0c;往往会遇到以下类似的问题&#xff0c;大致归纳如下:(1)抽象类和接口有什么本质的区别和联系&#xff1f;(2)什么时候选择使用抽象类&#xff0c;然啥时候使用接口最恰当呢&#xff1f;(3)在项目中怎样使用才…

开封游(二)

短暂的永远浪漫&#xff0c;漫长换来不满。人就是这样&#xff0c;第一天是怀着期盼喜悦的心情来的&#xff0c;等到二天&#xff0c;被漫长的行程磨平心境后就再也不想出来旅游了。 总之第二天的心情只能用疲倦来概括。 本来愉悦的心情&#xff0c;而转折点是在吃完海底捞之…

java 高并发面试题

转载自 java 高并发面试题 1、线程与进程 进程是一个实体。每一个进程都有它自己的地址空间&#xff0c;一般情况下&#xff0c;包括文本区域&#xff08;text region&#xff09;、数据区域&#xff08;data region&#xff09;和堆栈&#xff08;stack region&#xff09;。…

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

前言 我ssl模拟式爆炸了&#xff0c;我已经打算从1楼跳下去了 成绩 因为比赛的时候数据出bug&#xff0c;所以排名有些奇怪&#xff0c;就不放了。 正题 T1:nssl1162−T1:nssl1162-T1:nssl1162−农夫约的假期【中位数,,,贪心】 博客链接:https://blog.csdn.net/Mr_wuyongcon…

.NetCore之下载文件

本篇将和大家分享的丝.NetCore下载文件&#xff0c;常见的下载有两种&#xff1a;A标签直接指向下载文件地址和post或get请求后台输出文件流的方式&#xff0c;本篇也将围绕这两种来分享&#xff1b;如果对您有好的帮助&#xff0c;请多多支持。允许站点不识别content-type下载…

jeecg-boot中如何修改自定义主题颜色

大家好&#xff0c;我是雄雄。 前言 今天第一次上老丈人家&#xff0c;哈哈哈&#xff0c;有点猝不及防&#xff0c;本来没准备去&#xff0c;结果正好在小区门口碰到&#xff0c;人家让我去&#xff0c;我就把后备箱里面的东西拿下来带着去的。 聊了几个小时&#xff0c;也还…

开封一游后续

游玩过开封后还是很累的&#xff0c;等几个小时的火车更是相当的累。今天有缘坐火车的时候身边是一姑娘&#xff0c;前面没怎么聊&#xff0c;后面她讲她也是八点多到的&#xff0c;我就问她是不是阜阳的&#xff0c;和我们一个学校吗&#xff1f;就这样聊了起来&#xff0c;讲…

P1156-垃圾陷阱【dp】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1156 题目大意 有若干个垃圾&#xff0c;在tit_iti​时掉落&#xff0c;可以选择吃掉多活fif_ifi​天&#xff0c;也可以堆hih_ihi​高度&#xff0c;高度到达DDD就可以脱逃&#xff0c;求最短逃脱时…

跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

1谈一谈.NET 的跨平台终于要写到这一篇了。跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标。我在前面的文章已经提到过了&#xff0c;Microsoft Graph 服务针对一些主流的开源平台&#xff08;主要用来做跨平台应用&#xff09;都有支持&#xff0c;例如 python,…

两年 JAVA 程序员的面试总结

转载自 两年 JAVA 程序员的面试总结 前言 工作两年左右&#xff0c;实习一年左右&#xff0c;正式工作一年左右&#xff0c;其实挺尴尬的&#xff0c;高不成低不就。因此在面试许多公司&#xff0c;找到了目前最适合自己的公司之后。于是做一个关于面试的总结。希望能够给那…

用指针完成函数参数的调用

#include<stdio.h>addUp(int a,int b,int c){ cab;printf("%d\n",c); return c;}main(){int c;addUp(6,5,c);printf("%d",c); }可以在函数中完成数字的加减但是发现无法再主函数中调用&#xff0c;是个初始值22&#xff0c;所有得想个办法将函数的值…

P1220-关路灯【区间dp】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1220 题目大意 有n盏灯&#xff0c;每个灯的所在位置和1s消耗的能量不同&#xff0c;现在一个人在c号灯下&#xff0c;他行走速度1m/s&#xff0c;他走到的地方灯会熄灭&#xff0c;求最少消耗能量。…

Java 8中Stream API的这些奇技淫巧!你都Get到了吗?

转载自 Java 8中Stream API的这些奇技淫巧&#xff01;你都Get到了吗&#xff1f; Stream简介 Java 8引入了全新的Stream API。这里的Stream和I/O流不同&#xff0c;它更像具有Iterable的集合类&#xff0c;但行为和集合类又有所不同。stream是对集合对象功能的增强&#x…

基于Office 365的随需应变业务应用平台

这是我去年10月底在微软技术大会&#xff08;Microsoft Ignite 2016) 上面的演讲主题&#xff0c;承蒙大家抬爱&#xff0c;也沾了前一场明星讲师的光&#xff0c;我记得会场几乎是满座。观众中既有IT部门的技术人员&#xff0c;也有业务部门的用户&#xff0c;也有少量的开发人…

关于return的用法

return其实就是个返回值&#xff0c;你要是想获得它只需开辟一个空间&#xff0c;赋值即可 让a该函数&#xff1b;即可获得返回值 下面是利用返回值和函数直接打印出两数相乘 #include<stdio.h>add(int p,int q){return p*q;}int main(){int aadd(10,55);printf("%…

jeecg中新建接口后报错404的解决方法

大家好&#xff0c;我是雄雄。 前言 最近项目中&#xff0c;一直用的是jeecg-boot的微服务版本&#xff0c;尤其是第一次用微服务&#xff0c;所以在用的过程中&#xff0c;各种问题层出不穷&#xff0c;我们就在边学习边应用的道路上缓缓前进。 索性现在项目已经做的差不多了…

P2672-推销员【贪心】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2672 题目大意 每家住户有一个位置lil_ili​&#xff0c;推销会产生的疲劳值aia_iai​&#xff0c;向X家住户推销产品&#xff0c;对于每个X&#xff0c;要求使 ∑i1Xaxi2∗max{lxi}\sum_{i1}^{X}a_{…

一分钟理解Java公平锁与非公平锁

转载自 一分钟理解Java公平锁与非公平锁 和朋友聊天他提到&#xff1a;ReentrantLock 的构造函数可以传递一个 bool 数据&#xff0c;true 时构造的是“公平锁”、false 时构造的是“非公平锁”。我的印象中锁是不区分类型的&#xff0c;所以认为这应该是 Java 发明的概念&…

为什么你需要将代码迁移到ASP.NET Core 2.0?

随着 .NET Core 2.0 的发布&#xff0c;.NET 开源跨平台迎来了新的时代。开发者们可以选择使用命令行、个人喜好的文本编辑器、Visual Studio 2017 15.3 和 Visual Studio Code 来开发自己的 .NET Core 2.0 项目。同时&#xff0c;微软 .NET 开发工具组也宣布了 ASP.NET Core 2…