博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 23 F. MEX Queries 离散化+线段树
阅读量:5065 次
发布时间:2019-06-12

本文共 3521 字,大约阅读时间需要 11 分钟。

F. MEX Queries
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given a set of integer numbers, initially it is empty. You should perform n queries.

There are three different types of queries:

  • l r — Add all missing numbers from the interval [l, r]
  • l r — Remove all present numbers from the interval [l, r]
  • l r — Invert the interval [l, r] — add all missing and remove all present numbers from the interval [l, r]

After each query you should output MEX of the set — the smallest positive (MEX  ≥ 1) integer number which is not presented in the set.

Input

The first line contains one integer number n (1 ≤ n ≤ 105).

Next n lines contain three integer numbers t, l, r (1 ≤ t ≤ 3, 1 ≤ l ≤ r ≤ 1018) — type of the query, left and right bounds.

Output

Print MEX of the set after each query.

Examples
input
3 1 3 4 3 1 6 2 1 3
output
1 3 1
input
4 1 1 3 3 5 6 2 4 4 3 1 6
output
4 4 4 1
Note

Here are contents of the set after each query in the first example:

  1. {3, 4} — the interval [3, 4] is added
  2. {1, 2, 5, 6} — numbers {3, 4} from the interval [1, 6] got deleted and all the others are added
  3. {5, 6} — numbers {1, 2} got deleted

 

题意:给你n个区间,1操作表示把[l,r]赋值为1,2操作表示把[l,r]赋值为0,3操作表示把[l,r]异或1;

     求第一个不为0的正整数。

思路:对于所有区间[l,r]取出l,r,r+1三个点;

   离散化放入线段树中去

   现在需要区间修改,区间异或,查询

   需要两个lazy标记,一个存修改的值,一个存是否异或1.

   区间查询log查找即可,详见代码。

   小trick:需要加入最小值,即是1的情况;

#pragma comment(linker, "/STACK:1024000000,1024000000")#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define LL long long#define pi (4*atan(1.0))#define eps 1e-4#define bug(x) cout<<"bug"<
<
>1; if(to[pos]!=-1) { to[pos<<1]=to[pos]; to[pos<<1|1]=to[pos]; sum[pos<<1]=to[pos]*(mid-l+1); sum[pos<<1|1]=to[pos]*(r-mid); to[pos]=-1; sw[pos]=0; } if(sw[pos]) { if(to[pos<<1]!=-1)to[pos<<1]=!to[pos<<1]; else sw[pos<<1]=!sw[pos<<1]; if(to[pos<<1|1]!=-1)to[pos<<1|1]=!to[pos<<1|1]; else sw[pos<<1|1]=!sw[pos<<1|1]; sum[pos<<1]=(mid-l+1)-sum[pos<<1]; sum[pos<<1|1]=(r-mid)-sum[pos<<1|1]; sw[pos]=0; } } void build(int l,int r,int pos) { to[pos]=-1; sw[pos]=0; sum[pos]=0; if(l==r)return; int mid=(l+r)>>1; build(l,mid,pos<<1); build(mid+1,r,pos<<1|1); } void update(int L,int R,int c,int l,int r,int pos) { if(L<=l&&r<=R) { if(c==2) { if(to[pos]!=-1)to[pos]=!to[pos]; else sw[pos]=!sw[pos]; } else { to[pos]=c; sw[pos]=0; } if(c==2)sum[pos]=r-l+1-sum[pos]; else sum[pos]=(r-l+1)*c; return; } pushdown(pos,l,r); int mid=(l+r)>>1; if(L<=mid)update(L,R,c,l,mid,pos<<1); if(R>mid) update(L,R,c,mid+1,r,pos<<1|1); sum[pos]=sum[pos<<1|1]+sum[pos<<1]; } int query(int l,int r,int pos) { //cout<
<<" "<
<<" "<
<<" "<
<
>1; if(sum[pos<<1]==mid-l+1)return query(mid+1,r,pos<<1|1); else return query(l,mid,pos<<1); }}tree;int t[N],len;LL l[N],r[N],s[N];int getpos(LL x){ int pos=lower_bound(s+1,s+len,x)-s; return pos;}int main(){ int n,k=0; scanf("%d",&n); s[++k]=1; for(int i=1;i<=n;i++) scanf("%d%lld%lld",&t[i],&l[i],&r[i]),s[++k]=l[i],s[++k]=r[i],s[++k]=r[i]+1; sort(s+1,s+1+k); len=unique(s+1,s+1+k)-s; tree.build(1,L,1); for(int i=1;i<=n;i++) { int z=getpos(l[i]),y=getpos(r[i]); if(t[i]==1)tree.update(z,y,1,1,L,1); else if(t[i]==2)tree.update(z,y,0,1,L,1); else if(t[i]==3)tree.update(z,y,2,1,L,1); int x=tree.query(1,L,1); //cout<<"xxx "<
<<" "<
<

 

转载于:https://www.cnblogs.com/jhz033/p/7079334.html

你可能感兴趣的文章
基于grunt构建的前端集成开发环境
查看>>
MySQL服务读取参数文件my.cnf的规律研究探索
查看>>
java string(转)
查看>>
__all__有趣的属性
查看>>
写博客
查看>>
利用循环播放dataurl的视频来防止锁屏:NoSleep.js
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
ios封装静态库技巧两则
查看>>
Educational Codeforces Round 46 (Rated for Div. 2)
查看>>
Abstract Factory Pattern
查看>>
C# 实现Bresenham算法(vs2010)
查看>>
基于iSCSI的SQL Server 2012群集测试(一)--SQL群集安装
查看>>
list 容器 排序函数.xml
查看>>
Activity启动过程中获取组件宽高的五种方式
查看>>
java导出Excel表格简单的方法
查看>>
SQLite数据库简介
查看>>
利用堆实现堆排序&amp;优先队列
查看>>
Mono源码学习笔记:Console类(四)
查看>>
Android学习路线(十二)Activity生命周期——启动一个Activity
查看>>