题意:对一个维护三种操作: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[*MAXN];
int n,pre=,tot=,pos[MAXN],opt[MAXN];
LL lp[MAXN],rp[MAXN],num[MAXN],b[MAXN*];
void pushup(int k){tr[k].sum=tr[k<<].sum+tr[k<<|].sum;}
void pushdown(int k,int l,int r){
int mid=(l+r)>>;
if(tr[k].tag!=-){
tr[k<<].sum=(mid-l+)*tr[k].tag;
tr[k<<|].sum=(r-mid)*tr[k].tag;
tr[k<<].tag=tr[k<<|].tag=tr[k].tag;
tr[k<<].flag=tr[k<<|].flag=;
tr[k].tag=-;
}
if(tr[k].flag){
tr[k<<].sum=(mid-l+)-tr[k<<].sum;
tr[k<<|].sum=(r-mid)-tr[k<<|].sum;
tr[k<<].flag^=;
tr[k<<|].flag^=;
tr[k].flag=;
}
}
void build(int k,int l,int r){
tr[k].flag=;tr[k].tag=-;
if(l==r){
tr[k].sum=;
return;
}
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,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+)*t;
tr[k].tag=t;
tr[k].flag=;
return;
}
pushdown(k,l,r);
int mid=(l+r)>>;
if(R<=mid)cover(k<<,l,mid,L,R,t);
else if(L>mid)cover(k<<|,mid+,r,L,R,t);
else cover(k<<,l,mid,L,R,t),cover(k<<|,mid+,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+)-tr[k].sum;
tr[k].flag^=;
return;
}
pushdown(k,l,r);
int mid=(l+r)>>;
if(R<=mid)roate(k<<,l,mid,L,R);
else if(L>mid)roate(k<<|,mid+,r,L,R);
else roate(k<<,l,mid,L,R),roate(k<<|,mid+,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)>>;
if(tr[k<<].sum<mid-l+)return query(k<<,l,mid);
else return query(k<<|,mid+,r);
pushup(k);
}
int main(){
scanf("%d",&n);
for(int i=;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]=;
sort(b+,b+tot+);
int d=unique(b+,b+tot+)-b-;
for(int i=;i<=tot;i++)pos[i]=lower_bound(b+,b+d+,num[i])-b;
build(,,d);
for(int i=;i<=n;i++){
int l=pos[i*-],r=pos[i*]-;
if(opt[i]==)cover(,,d,l,r,);
else if(opt[i]==)cover(,,d,l,r,);
else roate(,,d,l,r);
printf("%I64d\n",b[query(,,d)]);
}
return ;
}

  

Codeforces 817F MEX Queries的更多相关文章

  1. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

  2. Educational Codeforces Round 23 F. MEX Queries 离散化+线段树

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

  3. [Codeforces 266E]More Queries to Array...(线段树+二项式定理)

    [Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...

  4. codeforces:MEX Queries分析和实现

    首先说明一下MEX,设S是自然数集合N的一个子集,那么S的MEX则为min(N\S),即不包含于S的最小自然数. 题目大意是存在一个空集S,提供n组输入(n<10^5),每组输入对应下面的一个指 ...

  5. Codeforces 797E - Array Queries

    E. Array Queries 题目链接:http://codeforces.com/problemset/problem/797/E time limit per test 2 seconds m ...

  6. 数据结构(线段树):CodeForces 145E Lucky Queries

    E. Lucky Queries time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

  7. Educational Codeforces Round 2_B. Queries about less or equal elements

    B. Queries about less or equal elements time limit per test 2 seconds memory limit per test 256 mega ...

  8. Codeforces 1117G Recursive Queries [线段树]

    Codeforces 洛谷:咕咕咕 思路 设\(L_i,R_i\)为\(i\)左右第一个大于它的位置. 对于每一个询问\(l,r\),考虑区间每一个位置的贡献就是\(\min(r,R_i-1)-\ma ...

  9. Codeforces 145E Lucky Queries 线段树

    Lucky Queries 感觉是很简单的区间合并, 但是好像我写的比较麻烦. #include<bits/stdc++.h> #define LL long long #define f ...

随机推荐

  1. DNS主从服务部署

    (1)节点信息 console01 主DNS 192.168.80.3 192.168.10.3 console02 从DNS 192.168.80.4 192.168.10.4 (2)环境部署 # ...

  2. Python CRM项目二

    一.准备工作 如果没有配置基本的项目,请参考 http://www.cnblogs.com/luhuajun/p/7771196.html 当我们配置完成后首先准备我们的app 创建2个app分别对应 ...

  3. Linux下Git安装、配置

    安装 首先查看下有没有安装过 输入 git,出现以下的,就说明安装过了. 否则, 执行命令:sudo apt-get install git    进行安装 安装好之后,还需要执行命令: git co ...

  4. nginx虚拟机配置(支持php)

    由于本人水平有限,以下记录仅作参考. 下面贴出我的一份正常运行的nginx服务器虚拟机配置./usr/local/nginx/conf/vhost/www.xsll.com.conf server { ...

  5. EduSoho程序上线实录

    1.1 修改配置文件 [root@web01 nginx]# cat /application/nginx/conf/extra/edusoho.conf server { listen 80; se ...

  6. javascript中的变量、作用域和内存问题

    1.变量 变量的值的类型:基本类型值和引用类型值两种. 基本类型:Undefined.Null.Boolean.String.Number,这五类基本数据类型的值在内存中占有固定大小的空间,因此保存在 ...

  7. scrolling 优化 避免卡顿

    让我们来瞧瞧在滚动时到底发生了什么.在理解这个问题之前,我们先简要的介绍下浏览器是如何向屏幕绘制内容的.这一切都是从 DOM 树(本质上就是页面中的所有元素)开始的.浏览器先检查拥有了样式的 DOM, ...

  8. SQL Server 2008对日期时间类型的改进

    微软在备受多年的争议后,终于对日期时间数据类型开刀了,在新版的SQL Server 2008中一口气增加了4种新的日期时间数据类型,包括: Date:一个纯的日期数据类型. Time:一个纯的时间数据 ...

  9. ASP.Net Controls 用法大全

    The FindControl method of the System.Web.UI.Control class appears simple enough to use. In fact, the ...

  10. [转载] java垃圾回收机制

    转载自http://blog.csdn.net/randyjiawenjie/article/details/7551228 http://www.daniel-journey.com/archive ...