题目链接:点击查看

题目大意:初始时有一个空的集合,需要执行 n 次操作:

  1. 1 l r:将区间 [ l , r ] 内未出现的数加入到集合中
  2. 2 l r:将区间 [ l , r ] 内出现的数字全部删除
  3. 3 l r:将区间 [ l , r ] 内未出现的数加入到集合中,同时将区间 [ l , r ] 内出现过的数字全部删除

每次操作后取集合的 MEX

题目分析:HDU - 3397 的弱化版

简化版题意就是,初始时有一个全 0 的序列,操作 1 是将区间内的数全部修改为 1,操作 2 是将区间内的数全部修改为 0,操作 3 是将区间内的数全部置反,即 0 变为 1,1 变为 0,每次询问需要回答从左侧开始首次出现的 0 的位置,三个操作其实就是一个比较基础的 lazy 序的实现,一个控制区间覆盖,一个控制区间翻转,而对于每次询问只需要在线段树上行整体二分就可以轻松得到答案了

需要注意的是因为区间范围非常的大,所以需要离线去做,先将区间离散化一下,因为对于某段操作 [ l , r ] 来说,只会影响到 l - 1 和 r + 1 ,所以离散化的时候多离散化几个点就好了

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;vector<LL>node;int n;struct qu
{int op;LL l,r;void input(){scanf("%d%lld%lld",&op,&l,&r);node.push_back(l);node.push_back(r);node.push_back(max(1LL,l-1));node.push_back(max(1LL,r-1));node.push_back(l+1);node.push_back(r+1);}
}q[N];void discreate()
{node.push_back(1);sort(node.begin(),node.end());node.erase(unique(node.begin(),node.end()),node.end());for(int i=1;i<=n;i++){q[i].l=lower_bound(node.begin(),node.end(),q[i].l)-node.begin();q[i].r=lower_bound(node.begin(),node.end(),q[i].r)-node.begin();}
}struct Node
{int l,r,len,sum,lazy1,lazy2;
}tree[N<<2];void pushup(int k)
{tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}void pushdown(int k)
{if(tree[k].lazy1!=-1){tree[k<<1].lazy2=tree[k<<1|1].lazy2=0;int lz=tree[k].lazy1;tree[k].lazy1=-1;tree[k<<1].lazy1=tree[k<<1|1].lazy1=lz;tree[k<<1].sum=tree[k<<1].len*lz;tree[k<<1|1].sum=tree[k<<1|1].len*lz;}if(tree[k].lazy2){int lz=tree[k].lazy2;tree[k].lazy2=0;tree[k<<1].lazy2^=1;tree[k<<1|1].lazy2^=1;tree[k<<1].sum=tree[k<<1].len-tree[k<<1].sum;tree[k<<1|1].sum=tree[k<<1|1].len-tree[k<<1|1].sum;}
}void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;tree[k].len=r-l+1;tree[k].lazy1=-1;tree[k].lazy2=0;tree[k].sum=0;if(l==r)return;int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}void update(int k,int l,int r,int op)//op=1,2,3
{if(tree[k].l>r||tree[k].r<l)return;if(tree[k].l>=l&&tree[k].r<=r){if(op==1){tree[k].sum=tree[k].len;tree[k].lazy1=1;tree[k].lazy2=0;}else if(op==2){tree[k].sum=0;tree[k].lazy1=0;tree[k].lazy2=0;}else if(op==3){tree[k].sum=tree[k].len-tree[k].sum;tree[k].lazy2^=1;}return;}pushdown(k);update(k<<1,l,r,op);update(k<<1|1,l,r,op);pushup(k);
}int query(int k)
{if(tree[k].l==tree[k].r)return tree[k].l;pushdown(k);if(tree[k<<1].sum!=tree[k<<1].len)return query(k<<1);elsereturn query(k<<1|1);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d",&n);for(int i=1;i<=n;i++)q[i].input();discreate();build(1,0,node.size()-1);for(int i=1;i<=n;i++){update(1,q[i].l,q[i].r,q[i].op);printf("%lld\n",node[query(1)]);}return 0;
}

CodeForces - 817F MEX Queries(线段树lazy序)相关推荐

  1. 20.CF817F MEX Queries 线段树(Lazy标记练习)

    20.CF817F MEX Queries 离散化+区间覆盖+区间反转线段树 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 要求维护 ...

  2. Codeforces 817F MEX Queries

    题意:对一个维护三种操作:1.将[l..r]中的数全部加入集合中.2.将集合中[l..r]范围内的数删去.3.将集合中在[l..r]中的数删去,并将之前不在集合中的数加入集合 考虑到最近线段树总是写爆 ...

  3. bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)

    3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...

  4. POJ 3468 线段树+lazy标记

    lazy标记   Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u  Submit S ...

  5. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  6. CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)

    题目链接:点击查看 题目大意:给出 n 个数组成的数组 a ,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 中所有元素的最小公倍数,强制在线 题目分析:首先考虑多个数的最小公倍数该如何 ...

  7. CodeForces - 620E New Year Tree(线段树+dfs序+状态压缩)

    题目链接:点击查看 题目大意:给出一棵无向树,每个节点都有一种颜色,接下来时m次操作: 1 x y:将x及其子树染成y的颜色 2 x:查询x及其子树上共有多少种不同的颜色 题目分析:看完这个题的第一反 ...

  8. Codeforces 877 E Danil and a Part-time Job(线段树+dfs序)

    题目地址 题意:给你一棵树,1为根节点,每个节点都有应该状态0或者1,你有两种操作,pow的操作是把该节点以及他的所有子树的每个节点进行自身异或的操作,get就是查询该节点以及他的所有子树的每个节点有 ...

  9. HDU5692(线段树+dfs序)

    Snacks Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Statu ...

最新文章

  1. sqlserver清除日志
  2. mybatis 源码分析, 初始化
  3. 二叉树的遍历实现-1(三级)
  4. CodeForces - 225C. Barcode(DP)
  5. 网站中公用头部与尾部
  6. Python二叉树遍历
  7. STM32之ADC单通道单次例程
  8. Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
  9. LSH︱python实现局部敏感随机投影森林——LSHForest/sklearn(一)
  10. Java多组输入实现 C++多组输入实现
  11. 【值得收藏】10个实现炫酷UI前端效果的CSS生成工具
  12. android开发中悬浮窗被禁用,无权限开启悬浮窗的解决方案
  13. FireMonkey v1.1的WinSoft WinRT-10.3-SEO-狼术
  14. 量子统计中的涨落和时间关联函数的概念(谐振子例子)
  15. CMS整站系统完全接触【转】
  16. 基于人脸特征点实现疲劳检测
  17. 我看过的安全方面的好文章
  18. ubuntu不支持安装搜狗_Ubuntu下安装搜狗输入法已经fcitx升级后搜狗输入法不能使用的解决办法...
  19. Power BI中的透视列和逆透视
  20. 记录使用Elasticsearch报错:FORBIDDEN/12/index read-only / allow delete (api)];]; nested exception is Elasti

热门文章

  1. linux编译安装madam,linux 下 使用 mdadm 创建阵列
  2. c语言怎么在服务器端查询进程列表,C语言 在服务器端识别客户端的方法
  3. linux mysql 5.6.24_Mysql实例Linux安装MySQL5.6.24使用文字说明
  4. feign 能干什么:
  5. leader选举的源码分析-QuorumPeer.start
  6. SpringMVC拦截器-快速入门(应用)
  7. HDFS的API操作-访问权限问题
  8. 数据库-优化-数据库结构的优化-数据类型
  9. 数据库-优化-子查询优化
  10. 13号线ab线规划图_大连地铁2050路线规划图