[loj6498]农民
对每一个节点用二元组$(p,v)$表示,其中$p$是其是父亲的左(0)还是右(1)儿子,$v$是其父亲的点权
$x$合法当且仅当:对于其到根路径上所有$(0,v)$都有$a_{x}<v$、$(1,v)$都有$a_{x}>v$
用树链剖分+线段树来维护这些二元组,即求出$(0,v)$的区间最小值和$(1,v)$的区间最大值即可
对于翻转,即将区间内(是$k$的子树除去$k$的部分)所有$(p,v)$变为$(p\oplus 1,v)$,即区间修改,并再维护$(0,v)$的区间最大值和$(1,v)$的区间最小值即可
(另外翻转后会改变区间,可以再开一棵线段树记录一下每一个点是否被翻转)
时间复杂度为$o(q\log^{2}n)$


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 #define pii pair<int,int>
8 #define fi first
9 #define se second
10 int rt,n,m,p,x,y,a[N],vis[N],ch[N][2],fa[N],sz[N],son[N],dfn[N],top[N],P[N<<2],tag[N<<2];
11 pii f[N<<2][2];
12 void dfs1(int k,int f){
13 if (!k)return;
14 fa[k]=f;
15 dfs1(ch[k][0],k);
16 dfs1(ch[k][1],k);
17 sz[k]=sz[ch[k][0]]+sz[ch[k][1]]+1;
18 son[k]=0;
19 if (sz[ch[k][0]]<sz[ch[k][1]])son[k]=1;
20 }
21 void dfs2(int k,int t){
22 if (!k)return;
23 dfn[k]=++dfn[0];
24 top[k]=t;
25 dfs2(ch[k][son[k]],t);
26 dfs2(ch[k][son[k]^1],ch[k][son[k]^1]);
27 }
28 void update_rev(int k,int l,int r,int x,int y){
29 if ((l>y)||(x>r))return;
30 if ((x<=l)&&(r<=y)){
31 P[k]^=1;
32 return;
33 }
34 update_rev(L,l,mid,x,y);
35 update_rev(R,mid+1,r,x,y);
36 }
37 int query_rev(int k,int l,int r,int x){
38 if (l==r)return P[k];
39 if (x<=mid)return query_rev(L,l,mid,x)^P[k];
40 return query_rev(R,mid+1,r,x)^P[k];
41 }
42 pii merge(pii x,pii y){
43 return make_pair(min(x.fi,y.fi),max(x.se,y.se));
44 }
45 void up(int k){
46 for(int i=0;i<2;i++)f[k][i]=merge(f[L][i],f[R][i]);
47 }
48 void upd(int k){
49 tag[k]^=1;
50 swap(f[k][0],f[k][1]);
51 }
52 void down(int k){
53 if (tag[k]){
54 upd(L);
55 upd(R);
56 tag[k]=0;
57 }
58 }
59 void update_val(int k,int l,int r,int x,int y,int p){
60 if (l==r){
61 f[k][0]=make_pair(y,0);
62 f[k][1]=make_pair(0x3f3f3f3f,y);
63 if (p)swap(f[k][0],f[k][1]);
64 return;
65 }
66 down(k);
67 if (x<=mid)update_val(L,l,mid,x,y,p);
68 else update_val(R,mid+1,r,x,y,p);
69 up(k);
70 }
71 void update_rev_val(int k,int l,int r,int x,int y){
72 if ((l>y)||(x>r))return;
73 if ((x<=l)&&(r<=y)){
74 upd(k);
75 return;
76 }
77 down(k);
78 update_rev_val(L,l,mid,x,y);
79 update_rev_val(R,mid+1,r,x,y);
80 up(k);
81 }
82 pii query_val(int k,int l,int r,int x,int y){
83 if ((l>y)||(x>r))return make_pair(0x3f3f3f3f,0);
84 if ((x<=l)&&(r<=y))return f[k][0];
85 down(k);
86 return merge(query_val(L,l,mid,x,y),query_val(R,mid+1,r,x,y));
87 }
88 void update(int k){
89 int p=query_rev(1,1,n,dfn[k]);
90 if (ch[k][0])update_val(1,1,n,dfn[ch[k][0]],a[k],p);
91 if (ch[k][1])update_val(1,1,n,dfn[ch[k][1]],a[k],p^1);
92 }
93 pii query(int k){
94 pii o=make_pair(0x3f3f3f3f,0);
95 while (k){
96 o=merge(o,query_val(1,1,n,dfn[top[k]],dfn[k]));
97 k=fa[top[k]];
98 }
99 return o;
100 }
101 int main(){
102 scanf("%d%d",&n,&m);
103 for(int i=1;i<=n;i++){
104 scanf("%d%d%d",&a[i],&ch[i][0],&ch[i][1]);
105 vis[ch[i][0]]=vis[ch[i][1]]=1;
106 }
107 for(int i=1;i<=n;i++)
108 if (!vis[i])rt=i;
109 dfs1(rt,0);
110 dfs2(rt,rt);
111 update_val(1,1,n,1,0x3f3f3f3f,0);
112 for(int i=1;i<=n;i++)update(i);
113 for(int i=1;i<=m;i++){
114 scanf("%d%d",&p,&x);
115 if (p==1){
116 scanf("%d",&a[x]);
117 update(x);
118 }
119 if (p==2){
120 update_rev(1,1,n,dfn[x],dfn[x]+sz[x]-1);
121 update_rev_val(1,1,n,dfn[x]+1,dfn[x]+sz[x]-1);
122 }
123 if (p==3){
124 pii o=query(x);
125 if ((a[x]<o.fi)&&(a[x]>o.se))printf("YES\n");
126 else printf("NO\n");
127 }
128 }
129 return 0;
130 }
[loj6498]农民的更多相关文章
- 【LOJ6498】「雅礼集训 2018 Day2」农民
题面 solution 直接暴力模拟,原数据可获得满分的成绩. 对于每个点,其父亲对其都有一个限制.故我们只需要判断当前点到根的路径上的限制是否都能满足即可. 考虑用树剖+线段树维护这个限制.考虑到翻 ...
- 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业
相关文章:随笔<一个程序猿的生命周期>- 逆潮流而动的“叛逆者” 15年前,依稀记得走出大山,进城求学的场景.尽管一路有父亲的陪伴,但是内心仍然畏惧.当父亲转身离去.准备回到 ...
- Android快速入门(转自 农民伯伯: http://www.cnblogs.com/over140/)
前言 这是前段时间用于公司Android入门培训的资料,学习Android三周时间收集整理的,时间仓促,希望能对像我这样还没入门就直接上项目的人一点帮助 :) 声明 欢迎转载,但请保留文章原始出处: ...
- [IT新应用]农民朋友的电子商务
今天通过http://olympiawa.gov/visitors.aspx olympia市的官网,到 http://www.olympiafarmersmarket.com/vendors-1/到 ...
- 转之农民伯伯 IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]
前言 在实现自己的Handler的时候只需要继承IHttpHandler接口就行了,在Handler中使用Session时,只需要继承一下IRequiresSessionState就行了,到底为什么只 ...
- IT农民的开发人员工具清单(2013年)
IT行业日新月异,每天都不断变化着.作为一名混迹IT行业小有几个年头码农来说,不仅要时刻提高自身技术,也要不断更新自己开发工具.这些工具都是我吃饭的饭碗.饭碗旧了也是需要买个新的.转眼之间,已到201 ...
- 「雅礼集训 2018 Day2」农民
传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...
- 传播正能量——做一个快乐的程序员
引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...
- EMC与地之重新认识地
记得在Mark的培训中,他手上拿了一个无线鼠标,然后问了一个很有意思的问题:“这个无线鼠标的地在哪里?同样,我们的手机没有和任何大地有接 触,那么这个地又在哪里呢?”这个问题确实很有意思,也确实让人很 ...
随机推荐
- 基于Tesseract组件的OCR识别
基于Tesseract组件的OCR识别 背景以及介绍 欲研究C#端如何进行图像的基本OCR识别,找到一款开源的OCR识别组件.该组件当前已经已经升级到了4.0版本.和传统的版本(3.x)比,4.0时代 ...
- Java编译运行环境讨论(复古但能加深对Java项目的理解)
Java编译运行环境讨论(复古但能加深对Java项目的理解) 如今我们大多数情况都会使用IDE来进行Java项目的开发,而一个如今众多优秀的IDE已经能够帮助我们自动的部署并调试运行我们的Java程序 ...
- 2019 年 CNCF 中国云原生调查报告
中国 72% 的受访者生产中使用 Kubernetes 在 CNCF,为更好地了解开源和云原生技术的使用,我们定期调查社区.这是第三次中国云原生调查,以中文进行,以便更深入地了解中国云原生技术采用的步 ...
- 题解 ABC216H Random Robots
link Solution 考虑一个不合法方案,它一定最后位置的逆序对数不为 \(0\),而且可以发现的是,存在对称方案使得最后逆序对数奇偶性不同,所以我们如果加上 \((-1)\)^{\sigma( ...
- SpringBoot-集成SpringSecurity
在 Web 开发中,安全一直是非常重要的一个方面. 安全虽然属于应用的非功能性需求,但是从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中. Spring Security官网 ...
- C++ cin和while cin
int main(){ string input; vector<string> arr; while(cin >> input) { cout << " ...
- jmeter基础功能及认识
1.基础知识: JMeter是免费开源的,纯java开发的性能测试工具,可以测试静态和动态的资源,例如:静态文件.java服务小程序.CGI脚本.java对象.数据库.FTP服务器.邮件服务器和Per ...
- kviy TextInput 触发事件
from kivy.uix.widget import Widget from kivy.app import App from kivy.lang import Builder Builder.lo ...
- Noip模拟47 2021.8.25
期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...
- numpy中的nan和常用方法
1.数组的拼接 import numpy as np t1 = np.array([[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]) t2 = np.array([ ...