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 makefile 编译多个.c文件 实例
本例由 main.c add.c sub.c add_sub.h 四个文件组成:编写Makefile执行程序 /******************************************* ...
- 如何在 Apple TV 上使用描述文件
您可以使用 OS X 上的 Apple Configurator 在 Apple TV 上安装配置描述文件. 开始前,请在 Mac 上安装最新版本的 Apple Configurator(如果尚未安装 ...
- 用户 'IIS APPPOOL\Private' 登录失败。
用户 'IIS APPPOOL\Private' 登录失败. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细 ...
- Xilinx ISE 14.1中模拟True Dual Port RAM例子
<一>创建工程 创建工程在此略过. <二>基本代码 1.创建一个Verilog modual代码如下: module main( input clk, input rsta, ...
- Restaurant
Restaurant Time Limit:4000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit ...
- 在ASP.NET Core中使用AOP来简化缓存操作
前言 关于缓存的使用,相信大家都是熟悉的不能再熟悉了,简单来说就是下面一句话. 优先从缓存中取数据,缓存中取不到再去数据库中取,取到了在扔进缓存中去. 然后我们就会看到项目中有类似这样的代码了. pu ...
- DOM遍历-祖先
遍历 - 祖先 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() parentsUntil() jQuery parent() ...
- 离线缓存 manifest
程序的离线缓存由一个叫做manifest的文本文件控制,把需要离线缓存的文件列在里面即可,这个列表还可以控制需要缓存的情况,甚至当用户从缓存地址进入到没有缓存的地址应该显示什么 当浏览器下载解析了ma ...
- css伪类的说明以及使用(css事件)
CSS伪类的使用(css事件) 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7670959.html 之前有开发开发App的时候,有同事问我那个列表的条目按下 ...
- javaOOP-基础知识
面向对象基础 一.类的定义 访问修饰符 class 类名{ 类成员列表 } 访问修饰符:public和package(默认) package表示一个包中可以访问,是java默认的访问修饰符,pack ...