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 ...
随机推荐
- Linux驱动模型解析bus之platform bus
这是内核启动之后要调用的驱动模型的开始代码: drivers/base/init.c/** * driver_init - initialize driver model. * * Call the ...
- Muduo阅读笔记---net(三)
muduo-manual手册一开始就介绍了“Muduo是基于Reactor模式的网络库”,因此必须对Reactor模式有一定的了解才行:另外,文中还提到EventLoop,这些知识点我目前都不太了解.
- Strange fuction
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- MySQL-client-5.6.36-1.linux_glibc2.5.x86_64.rpm安装详解
centos6.8已经安装了mysql,所以要卸载掉 查看命令 rpm -qa | grep mysql 注意:MySQL区分大小写 grep mysql 和grep MySQL 是不一样的!! 卸载 ...
- VS2015企业版序列号
vs2015 企业版HM6NR-QXX7C-DFW2Y-8B82K-WTYJV2XNFG-KFHR8-QV3CP-3W6HT-683CH
- Pycharm,Python原生IDE?
老套路,安装和使用(Win7x64.JDK神马滴早已装好). 1.安装 网上下下来后就这东西 Next D盘路径 我选择.我喜欢 开装 好慢,以后用光纤 O了 桌面小图标 2.使用 以管理员身份打开软 ...
- ThinkPHP模版验证要注意的地方
Model页面 <?php class LoginModel extends Model { //protected $tableName = 'userinfo'; //表名和model不一致 ...
- 实现一个websocket服务器-理论篇
本文是Writing WebSocket servers的中文文档,翻译自MDNWriting WebSocket servers.篇幅略长,个人能力有限难免有所错误,抛砖引玉共同进步. websoc ...
- WebGL学习(2) - 3D场景
原文地址:WebGL学习(2) - 3D场景 经过前面WebGL学习(1) - 三角形的学习,我们已经掌握了webGL的基础知识,也已经能够画出最基本的图形,比如点,线,三角形,矩形等.有了2D绘图的 ...
- C#中??和?分别是什么意思?
在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null ...