题面

solution

直接暴力模拟,原数据可获得满分的成绩。

对于每个点,其父亲对其都有一个限制。故我们只需要判断当前点到根的路径上的限制是否都能满足即可。

考虑用树剖+线段树维护这个限制。考虑到翻转操作,我们需维护当前区间左儿子限制最小值/最大值和右儿子最小值/最大值。

注意翻转操作会导致树的形态的改变。

code

#include<cstdio>
#include<algorithm>
using namespace std;
namespace io {
const int SIZE=(1<<21)+1;
char ibuf[SIZE],*iS,*iT,c;
#define gc()(iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)
inline int gi (){
int x=0,f=1;
for(c=gc();c<'0'||c>'9';c=gc())if(c=='-')f=-1;
for(;c<='9'&&c>='0';c=gc()) x=(x<<1)+(x<<3)+(c&15); return x*f;
}
} using io::gi;
const int N=1e5+5,inf=1<<30;
int n,m,a[N],ls[N],rs[N],size[N],son[N],top[N],dep[N],fa[N],id[N],ed[N],idx[N],tim,rt;
int mxl[N<<2],mnl[N<<2],mxr[N<<2],mnr[N<<2];
bool nr[N],isl[N],rev[N<<2],tg[N<<2];
#define lx (x<<1)
#define rx (x<<1|1)
void dfs(int u)
{
if(!u) return ;
size[u]=1;
fa[ls[u]]=u,fa[rs[u]]=u;
dep[ls[u]]=dep[rs[u]]=dep[u]+1;
dfs(ls[u]),dfs(rs[u]);
son[u]=(size[ls[u]]>size[rs[u]]?ls[u]:rs[u]);
}
void dfs2(int u, int tp)
{
if(!u) return ;
id[u]=++tim;
top[u]=tp, idx[tim]=u;
isl[ls[u]]=true;
if(son[u]==ls[u]) dfs2(ls[u],tp),dfs2(rs[u],rs[u]);
else dfs2(rs[u],tp),dfs2(ls[u],ls[u]);
ed[u]=tim;
}
void pushup(int x)
{
mxl[x]=max(mxl[lx],mxl[rx]);
mnl[x]=min(mnl[lx],mnl[rx]);
mxr[x]=max(mxr[lx],mxr[rx]);
mnr[x]=min(mnr[lx],mnr[rx]);
}
void pushdown(int x)
{
if(!rev[x]) return ;
rev[lx]^=1,rev[rx]^=1;
tg[lx]^=1,tg[rx]^=1;
swap(mxl[lx],mxr[lx]);
swap(mnl[lx],mnr[lx]);
swap(mxl[rx],mxr[rx]);
swap(mnl[rx],mnr[rx]);
rev[x]=0;
}
void upd(int x, int u, int w)
{
if(u==1) mxl[x]=mxr[x]=-1,mnl[x]=mnr[x]=inf;
else if(isl[u]^tg[x]) mxl[x]=mnl[x]=w,mxr[x]=-1,mnr[x]=inf;
else mxr[x]=mnr[x]=w,mxl[x]=-1,mnl[x]=inf;
}
void build(int x, int l, int r)
{
if(l==r)
{
upd(x,idx[l],a[fa[idx[l]]]);
return ;
}
int mid=l+r>>1;
build(lx,l,mid),build(rx,mid+1,r);
pushup(x);
}
void update(int x, int l, int r, int s, int w)
{
if(l==r)
{
upd(x,idx[l],w);
return ;
}
pushdown(x);
int mid=l+r>>1;
s<=mid?update(lx,l,mid,s,w):update(rx,mid+1,r,s,w);
pushup(x);
}
void rever(int x, int l, int r, int sl, int sr)
{
if(sl<=l&&r<=sr)
{
rev[x]^=1,tg[x]^=1;
swap(mxl[x],mxr[x]);
swap(mnl[x],mnr[x]);
return ;
}
pushdown(x);
int mid=l+r>>1;
if(sl<=mid) rever(lx,l,mid,sl,sr);
if(sr>mid) rever(rx,mid+1,r,sl,sr);
pushup(x);
}
pair<int,int> query(int x, int l, int r, int sl, int sr)
{
if(sl<=l&&r<=sr) return make_pair(mnl[x],mxr[x]);
pushdown(x);
int mid=l+r>>1;
if(sr<=mid) return query(lx,l,mid,sl,sr);
else if(sl>mid) return query(rx,mid+1,r,sl,sr);
else
{
pair<int,int> ql=query(lx,l,mid,sl,sr),qr=query(rx,mid+1,r,sl,sr);
int ans_mnl,ans_mxr;
ans_mnl=min(ql.first,qr.first);
ans_mxr=max(ql.second,qr.second);
return make_pair(ans_mnl,ans_mxr);
}
}
bool check(int x)
{
int ans_mnl=inf,ans_mxr=-1,w=a[x];
while(top[x]^top[rt])
{
pair<int,int> q=query(1,1,n,id[top[x]],id[x]);
ans_mnl=min(ans_mnl,q.first);
ans_mxr=max(ans_mxr,q.second);
x=fa[top[x]];
}
pair<int,int> q=query(1,1,n,id[rt],id[x]);
ans_mnl=min(ans_mnl,q.first);
ans_mxr=max(ans_mxr,q.second);
return (w<ans_mnl&&w>ans_mxr);
}
int main()
{
n=gi(),m=gi();
for(int i=1;i<=n;++i) a[i]=gi(),ls[i]=gi(),rs[i]=gi(),nr[ls[i]]=nr[rs[i]]=true;
for(int i=1;i<=n;++i) if(!nr[i]) rt=i;
dfs(rt),dfs2(rt,rt),build(1,1,n);
while(m--)
{
int op=gi(),x=gi();
if(op==1)
{
int w=gi();
if(ls[x]) update(1,1,n,id[ls[x]],w);
if(rs[x]) update(1,1,n,id[rs[x]],w);
a[x]=w;
}
if(op==2) rever(1,1,n,id[x]+1,ed[x]);
if(op==3) puts(check(x)?"YES":"NO");
}
}

【LOJ6498】「雅礼集训 2018 Day2」农民的更多相关文章

  1. 「雅礼集训 2018 Day2」农民

    传送门 Description  「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...

  2. LOJ6500. 「雅礼集训 2018 Day2」操作(哈希+差分)

    题目链接 https://loj.ac/problem/6500 题解 区间取反 \(01\) 串的经典套路是差分.我们令 \(b_i = a_i\ {\rm xor}\ a_{i - 1}\)(\( ...

  3. 【卡常 bitset 分块】loj#6499. 「雅礼集训 2018 Day2」颜色

    好不容易算着块大小,裸的分块才能过随机极限数据:然而这题在线的数据都竟然是构造的…… 题目描述 有 $n$ 个数字,第 $i$ 个数字为 $a_i$. 有 $m$ 次询问,每次给出 $k_i$ 个区间 ...

  4. #6499. 「雅礼集训 2018 Day2」颜色 [分块,倍增,bitset]

    bitset压位,因为是颜色数,直接倍增,重合部分不管,没了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #d ...

  5. 「LOJ #6500」「雅礼集训 2018 Day2」操作

    description LOJ 6500 solution 根据常有套路,容易想到将区间差分转化为异或数组上的单点修改,即令\(b_i=a_i \ xor\ a_{i-1}\), 那么将\([l,l+ ...

  6. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  7. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...

  8. 【loj6034】「雅礼集训 2017 Day2」线段游戏

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...

  9. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

随机推荐

  1. python 基础之深浅拷贝

    深浅拷贝 s=[[1,2],'fgfgf','cx'] s3=s.copy() print(s) print(s3) 测试 D:\python\python.exe D:/untitled/dir/f ...

  2. Caffe2 模型与数据集(Models and Datasets)[3]

    Models and Datasets 这一节没什么有用的信息为了保证教程完整性,这里仍然保留这一节. 这一节唯一提到的一点就是: Caffe2的模型文件后缀是:.pb2 结语: 转载请注明出处:ht ...

  3. 敏捷团队协作:Confluence简易教程

      0.Confluence简介 Confluence是一个企业级的Wiki软件,可用于在企业.部门.团队内部进行信息共享和协同编辑. 1.基础概念 Confluence的使用并不复杂,只需掌握如下几 ...

  4. 题解 JSOI2010 找零钱的洁癖

    题解 JSOI2010 找零钱的洁癖 题面 BZOJ 个人体会 van全没有思路... 只能去看题解... 还是个bfs+贪心 不管怎样竟然乱搞过了... 听M_sea小姐姐说她有更正经的做法(线性规 ...

  5. 「IOI2014」Wall 砖墙

    题目描述 给定一个初始元素为 \(0\) 的数列,以及 \(K\) 次操作: 将区间 \([L, R]\) 中的元素对 \(h\) 取 \(max\) 将区间 \([L, R]\) 中的元素对 \(h ...

  6. linux安装jdk并设置环境变量(看这一篇文章即可)

    1.查看linux位数 查看linux是32位还是64位,影响需要下载JDK的版本   系统位数 jdk位数 x86(32位) 32位 x86_64(64位) 32位 64位 在linux命令输入: ...

  7. K8S LoadBalance 私有环境解决方案 == metallb 工具安装和使用介绍

    接着上文,排除故障后,我重新配置了metallb组件到k8s环境. metallb为k8s service 的loadbalance负载方式提供免费的解决方案. external-ip的收费方案,可以 ...

  8. NetCore Web项目目录结构说明

    目录结构说明 目录/文件 说明 依赖项 ASP.NET Core 开发.构建和运行过程中的依赖想,一般都是 NuGet 包和一些 SDK Properties 配置,存放了一些 .json 文件用于配 ...

  9. 【快学springboot】7.使用Spring Boot Jpa

    jpa简介 Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据. ...

  10. 一个前端博主的nginx+php+mysql的环境搭建

    这几天天某的公司给了在下一个需求,让我修改一个后端大佬用PHP写的一个官网,虽然说修改的内容还是很简单,但是毕竟之前还是没接触过PHP,于是开始了漫长的爬坑之旅,话不多说,这次就给大家介绍一下我配置安 ...