[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的培训中,他手上拿了一个无线鼠标,然后问了一个很有意思的问题:“这个无线鼠标的地在哪里?同样,我们的手机没有和任何大地有接 触,那么这个地又在哪里呢?”这个问题确实很有意思,也确实让人很 ...
随机推荐
- 11.4.3 LVS-TUN
LVS-TUN 用IP隧道技术实现虚拟服务器。这种方式是在集群的节点不在同一个网段时可用的转发机制,是将IP包封装在其他网络流量中的方法。为了安全的考虑,应该使用隧道技术中的VPN,也可使用租用专线。 ...
- MacOS上通过虚拟机搭建基础CentOS7系统环境
MacOS上通过虚拟机搭建基础CentOS7系统环境 尽管从Mac的Terminal可以看出,macOS与UNIX.Linux或多或少都有血缘关系(shell.bash等),但是在mac进行Linux ...
- Golang/Java 实现无重复字符的最长子串 - LeetCode 算法
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-subs ...
- iostream 操作符
iostream 操作符 Input/output manipulators - cppreference.com
- python 类方法 静态方法
属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法: ...
- 如何知道当前使用的python的安装路径
电脑里多处安装了python,那么如何得知当前使用python的安装路径呢? 方法一 运行python指令: import sys print(sys.executable) 方法二 对于终端和Win ...
- JVM:Java中的引用
JVM:Java中的引用 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 在原来的时候,我们谈到一个类的实例化 Person p = new Person() 在 ...
- 计算机网络:HTTP
计算机网络基础:HTTP 先验知识 HTTP和其他协议的关系 通过下图,了解IP协议,TCP协议,DNS服务在使用HTTP协议通信过程中各自发挥的作用: 服务器处理流程 接受客户端连接 ------& ...
- sip信令跟踪工具sngrep
概述 在VOIP的使用过程中,最常见的问题就是信令不通和语音质量问题. 通常的问题跟踪手段包括日志分析.抓包分析. 抓包的工具有wireshark.tcpdump等等,如果是只针对sip信令的抓包,则 ...
- Scrum Meeting 1补充会议
日期:2021年04月24日 会议主要内容概述: 本次会议于11:30举行,对项目架构做出了重要调整,并根据该调整修改了第1次例会报告中后两日计划完成的工作部分. 一.架构调整 会上讨论了用户模块相关 ...