Codeforces 817F MEX Queries
题意:对一个维护三种操作: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的更多相关文章
- [Codeforces]817F. MEX Queries 离散化+线段树维护
[Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...
- 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 ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- codeforces:MEX Queries分析和实现
首先说明一下MEX,设S是自然数集合N的一个子集,那么S的MEX则为min(N\S),即不包含于S的最小自然数. 题目大意是存在一个空集S,提供n组输入(n<10^5),每组输入对应下面的一个指 ...
- Codeforces 797E - Array Queries
E. Array Queries 题目链接:http://codeforces.com/problemset/problem/797/E time limit per test 2 seconds m ...
- 数据结构(线段树):CodeForces 145E Lucky Queries
E. Lucky Queries time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...
- 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 ...
- Codeforces 1117G Recursive Queries [线段树]
Codeforces 洛谷:咕咕咕 思路 设\(L_i,R_i\)为\(i\)左右第一个大于它的位置. 对于每一个询问\(l,r\),考虑区间每一个位置的贡献就是\(\min(r,R_i-1)-\ma ...
- Codeforces 145E Lucky Queries 线段树
Lucky Queries 感觉是很简单的区间合并, 但是好像我写的比较麻烦. #include<bits/stdc++.h> #define LL long long #define f ...
随机推荐
- sqoop1.4.6从mysql导入hdfs\hive\hbase实例
//验证sqoop是否连接到mysql数据库sqoop list-tables --connect 'jdbc:mysql://n1/guizhou_test?useUnicode=true& ...
- zookeeper启动后的注意事项
在各节点中运行zkServer.sh start后 1.首先看进程是否存在 QuorumPeerMain. 2.查看zookeeper的运行状态 zkServer.sh status,会出现一个lea ...
- HDU 6069 Counting Divisors
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- cloneNode克隆节点在不同浏览器的差异
cloneNode是用于克隆节点的,如果待克隆的节点还有子节点以及自定义属性.添加的有事件,那么克隆时,可以指定是克隆节点本身,还是将其所有子节点信息也克隆进去,这是通过给cloneNode传递一个布 ...
- Fiddler手机抓包图文教程
上篇Fiddler教程,我们教了大家Fiddler安装配置及如何使用Fiddler进行基本的Http抓包及模拟请求,今天给大家介绍下如何使用Fiddler进行手机抓包. 运行环境为Windows 10 ...
- 30个CSS3选择器的应用
或许大家平时总是在用的选择器都是: id class 以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选 或许大家平时总是在用的选择器都是:#id .class ...
- 【收藏】Web前端开发第三方插件大全
收集整理了一些Web前端开发比较成熟的第三方插件,分享给大家. ******************************************************************** ...
- Lombok 使用小结
Lombok 简介 Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注释实现这一目的.通过在开发环境中实现 Lo ...
- rewirte 规则
Nginx Rewrite Rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正则 表达式是基于 Perl 语言.通常而言,几乎所有的 WEB 服务器均可以支持 ...
- C/C++程序在main之前执行代码
来源:<周哥教IT.C语言深学活用>https://ke.qq.com/course/242707#tuin=a71606 我们在学习C/C++语言的时候,通常认为main函数是整个程序执 ...