题意:对一个维护三种操作: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. sqoop1.4.6从mysql导入hdfs\hive\hbase实例

    //验证sqoop是否连接到mysql数据库sqoop list-tables --connect 'jdbc:mysql://n1/guizhou_test?useUnicode=true& ...

  2. zookeeper启动后的注意事项

    在各节点中运行zkServer.sh start后 1.首先看进程是否存在 QuorumPeerMain. 2.查看zookeeper的运行状态 zkServer.sh status,会出现一个lea ...

  3. HDU 6069 Counting Divisors

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  4. cloneNode克隆节点在不同浏览器的差异

    cloneNode是用于克隆节点的,如果待克隆的节点还有子节点以及自定义属性.添加的有事件,那么克隆时,可以指定是克隆节点本身,还是将其所有子节点信息也克隆进去,这是通过给cloneNode传递一个布 ...

  5. Fiddler手机抓包图文教程

    上篇Fiddler教程,我们教了大家Fiddler安装配置及如何使用Fiddler进行基本的Http抓包及模拟请求,今天给大家介绍下如何使用Fiddler进行手机抓包. 运行环境为Windows 10 ...

  6. 30个CSS3选择器的应用

    或许大家平时总是在用的选择器都是: id class 以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选 或许大家平时总是在用的选择器都是:#id  .class ...

  7. 【收藏】Web前端开发第三方插件大全

    收集整理了一些Web前端开发比较成熟的第三方插件,分享给大家. ******************************************************************** ...

  8. Lombok 使用小结

    Lombok 简介 Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注释实现这一目的.通过在开发环境中实现 Lo ...

  9. rewirte 规则

    Nginx Rewrite Rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正则 表达式是基于 Perl 语言.通常而言,几乎所有的 WEB 服务器均可以支持 ...

  10. C/C++程序在main之前执行代码

    来源:<周哥教IT.C语言深学活用>https://ke.qq.com/course/242707#tuin=a71606 我们在学习C/C++语言的时候,通常认为main函数是整个程序执 ...