题意:对一个维护三种操作:1.将[l..r]中的数全部加入集合中。2.将集合中[l..r]范围内的数删去。3.将集合中在[l..r]中的数删去,并将之前不在集合中的数加入集合

考虑到最近线段树总是写爆,我决定在CF上切几道水题练练手,于是找到了这题。。。一开始想了想感觉不太会做,后来发现好像可以离散化后用线段树维护区间1的个数来解决。1就是将[l..r]中的所有数赋值为1,2反之,3就是区间长度-当前1的个数。然后敲了很久,最后惊喜地发现我又特么敲爆了。。。调了好久发现是离散化出了问题。。。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 300000+10
typedef long long LL;
struct tree{int sum,tag,flag;}tr[10*MAXN];
int n,pre=1,tot=0,pos[MAXN],opt[MAXN];
LL lp[MAXN],rp[MAXN],num[MAXN],b[MAXN*2];
void pushup(int k){tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;}
void pushdown(int k,int l,int r){int mid=(l+r)>>1;if(tr[k].tag!=-1){tr[k<<1].sum=(mid-l+1)*tr[k].tag;tr[k<<1|1].sum=(r-mid)*tr[k].tag;tr[k<<1].tag=tr[k<<1|1].tag=tr[k].tag;tr[k<<1].flag=tr[k<<1|1].flag=0;tr[k].tag=-1;}if(tr[k].flag){tr[k<<1].sum=(mid-l+1)-tr[k<<1].sum;tr[k<<1|1].sum=(r-mid)-tr[k<<1|1].sum;tr[k<<1].flag^=1;tr[k<<1|1].flag^=1;tr[k].flag=0;}
}
void build(int k,int l,int r){tr[k].flag=0;tr[k].tag=-1;if(l==r){tr[k].sum=0;return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);
}
void cover(int k,int l,int r,int L,int R,int t){
//    printf("%d %d %d\n",k,l,r);if(l>=L&&r<=R){tr[k].sum=(r-l+1)*t;tr[k].tag=t;tr[k].flag=0;return;}pushdown(k,l,r);int mid=(l+r)>>1;if(R<=mid)cover(k<<1,l,mid,L,R,t);else if(L>mid)cover(k<<1|1,mid+1,r,L,R,t);else cover(k<<1,l,mid,L,R,t),cover(k<<1|1,mid+1,r,L,R,t);pushup(k);
}
void roate(int k,int l,int r,int L,int R){
//    printf("%d %d %d\n",k,l,r);if(l>=L&&r<=R){tr[k].sum=(r-l+1)-tr[k].sum;tr[k].flag^=1;return;}pushdown(k,l,r);int mid=(l+r)>>1;if(R<=mid)roate(k<<1,l,mid,L,R);else if(L>mid)roate(k<<1|1,mid+1,r,L,R);else roate(k<<1,l,mid,L,R),roate(k<<1|1,mid+1,r,L,R);pushup(k);
}
int query(int k,int l,int r){
//    printf("%d %d %d\n",k,l,r);if(l==r)return l;pushdown(k,l,r);int mid=(l+r)>>1;if(tr[k<<1].sum<mid-l+1)return query(k<<1,l,mid);else return query(k<<1|1,mid+1,r);pushup(k);
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%I64d%I64d",&opt[i],&lp[i],&rp[i]);rp[i]++;b[++tot]=num[tot]=lp[i];b[++tot]=num[tot]=rp[i];}num[++tot]=b[tot]=pos[tot]=1;sort(b+1,b+tot+1);int d=unique(b+1,b+tot+1)-b-1;for(int i=1;i<=tot;i++)pos[i]=lower_bound(b+1,b+d+1,num[i])-b;build(1,1,d);for(int i=1;i<=n;i++){int l=pos[i*2-1],r=pos[i*2]-1;if(opt[i]==1)cover(1,1,d,l,r,1);else if(opt[i]==2)cover(1,1,d,l,r,0);else roate(1,1,d,l,r);printf("%I64d\n",b[query(1,1,d)]);}return 0;
}

  

转载于:https://www.cnblogs.com/NINGLONG/p/7683488.html

Codeforces 817F MEX Queries相关推荐

  1. CodeForces - 817F MEX Queries(线段树lazy序)

    题目链接:点击查看 题目大意:初始时有一个空的集合,需要执行 n 次操作: 1 l r:将区间 [ l , r ] 内未出现的数加入到集合中 2 l r:将区间 [ l , r ] 内出现的数字全部删 ...

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

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

  3. [CF817F]MEX Queries

    MEX Queries 题解 线段树板子题 我们可以先根据所有点的颜色来建一棵线段树. 很明显,1,2操作就相当于区间赋值,3操作就相当于区间翻转,这些通过打标记就可以解决. 但需要注意区间赋值的标记 ...

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

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

  5. Codeforces 1144D Deduction Queries 并查集

    Deduction Queries 用并查集维护前缀的关系, 在同一个联通块内两两之间的异或值都是已知的. 每个点再维护一个和它当前父亲的异或值, 压缩路径的时候更新一下就好了. #include&l ...

  6. 【CodeForces - 245H 】Queries for Number of Palindromes (带容斥的区间dp)

    题干: You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. The ...

  7. Codeforces Ilya and Queries

    递推(DP) http://codeforces.com/contest/313/problem/B 题意:比较好懂,一个字符串只有.或者#字符,给你一段区间[x,y],其实y>x,让你在这个区 ...

  8. CF Educational Round 23 F.MEX Queries

    写了3小时 = =.这两天堕落了,昨天也刷了一晚上hihocoder比赛,还爆了零.之后得节制点了,好好准备考研.. 首先很容易想到 压缩数据 + 线段树 然后对于Pushdown真很难写..需要牵涉 ...

  9. CodeForces - 817F Graph and String(dfs判二分图)

    题目链接:点击查看 题目大意:给出一张图,现在要求给出一种合适的染色方案,使得: 只能用 ' a ' , ' b ' , ' c ' 进行染色 有边相连的两个点的颜色要么相同,要么相邻,不能是 ' a ...

最新文章

  1. 想学Python,梦雅给你指一条明路!
  2. C语音的预处理,编译,汇编,链接过程分析
  3. javascript学习系列(10):数组中的slice方法
  4. 钉钉免登陆前端操作详解
  5. 洛谷P2234 [HNOI2002]营业额统计 set简易解法
  6. 数字电子技术基础(六):译码器、数据选择器
  7. C# Json转对象(object)
  8. Python3,为了“娑娜“,我花费3分钟把lol所有的英雄都下载了。
  9. Windows Server 2016 身份管理 (MCSA 认证 70-742)-李海园-专题视频课程
  10. 高情商的人都在这样表现汇报工作
  11. oracle 10 dbca第12步,第10步:DBCA创建实例
  12. P3332 [ZJOI2013]K大数查询 - 整体二分-区间修改
  13. 迪拜“烧掉800亿”造了座烂尾岛,奇葩建筑惊呆网友:有钱人的世界,我不懂!
  14. 面向对象的三大要素和五大原则
  15. cnforum使用MasterPages实现Web窗体模板
  16. 51使用LCD1602液晶显示(复习总结)
  17. 沈阳故宫挂“门神”迎新年
  18. C++ MFC万能的类向导
  19. 宝可梦探险寻宝料理php,宝可梦探险寻宝所有料理配方汇总 超梦等稀有烹饪配方...
  20. 山东ISO9001标准的特点和作用

热门文章

  1. DB2-407 SQLCODE: -407, SQLSTATE: 23502
  2. 软件_git异常错误[博]
  3. csharp与java的区别_C#与JAVA之比较(1)
  4. 如何用报表解决销售工作衡量问题
  5. 计算机二级矿大考点哪个校区,计算机二级考点哪个近一点555
  6. linux 7 yum源,Linux Redhat 7 安装免费yum源
  7. coreldraw x4如何出血_告诉你如何把cdr转换成适合印刷的pdf
  8. samp服务器信息获取,手把手教你写一个简单的服务器
  9. springboot后台怎么获取前端传过来的excel_基于SpringBoot的全自动办公系统源码文档全部免费分享...
  10. 华为手机投屏电脑_华为手机如何实现无线投屏?