Educational Codeforces Round 23F
http://codeforces.com/contest/817/problem/F
无限长的数组,刚开始每一位是0,三种操作,1,把(l,r)之间不是1的变成1,2,把(l,r)之间不是0的变成0,3,把0变成1,1变成0,每次操作都要查询该数组的mex(最小的没有在集合中出现的数)
解法:很明显的线段树,lazy标记有3个,分别代表3中操作的,当pushdown的时候如果lazy为1或2都直接下传,但是当lazy是3的时候,不能直接下传,因为1,2操作优先级更大,所以pushdown时特判一下这种情况即可(当儿子的lazy为1时,刚好需要先全变1然后翻转就是2操作1了,lazy为2同理,lazy为3的话直接翻转两次等同于没有翻转),查询的话,直接查询左右区间,如果左区间是满的,那么右边,否则查询左侧,注意hash的时候把1加上去,每个点左右两个点也要加进去,不然会出现断层!!
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pii pair<int,int>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; struct qu{
int t;
ll l,r;
}q[N];
int lazy[N<<],value[N<<];
int cnt;
ll Hash[N<<];
void pushup(int rt)
{
value[rt]=value[rt<<]+value[rt<<|];
}
void pushdown(int l,int r,int rt)
{
int m=(l+r)>>;
if(lazy[rt]==)
{
value[rt<<]=m-l+;
value[rt<<|]=r-m;
lazy[rt<<]=lazy[rt<<|]=;
}
else if(lazy[rt]==)
{
value[rt<<]=value[rt<<|]=;
lazy[rt<<]=lazy[rt<<|]=;
}
else if(lazy[rt]==)
{
value[rt<<]=m-l+-value[rt<<];
value[rt<<|]=r-m-value[rt<<|];
lazy[rt<<]=-lazy[rt<<];
lazy[rt<<|]=-lazy[rt<<|];
}
lazy[rt]=;
}
void build(int l,int r,int rt)
{
value[rt]=,lazy[rt]=;
if(l==r)return ;
int m=(l+r)>>;
build(ls);build(rs);
}
void update(int L,int R,int op,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
if(op==)
{
value[rt]=r-l+;
lazy[rt]=op;
}
else if(op==)
{
value[rt]=;
lazy[rt]=op;
}
else
{
if(lazy[rt])pushdown(l,r,rt);
value[rt]=r-l+-value[rt];
lazy[rt]=op;
}
return ;
}
pushdown(l,r,rt);
int m=(l+r)>>;
if(L<=m)update(L,R,op,ls);
if(m<R)update(L,R,op,rs);
pushup(rt);
}
int query(int l,int r,int rt)
{
if(l==r)return l;
pushdown(l,r,rt);
int m=(l+r)>>;
if(value[rt<<]==m-l+)return query(rs);
else return query(ls);
}
void add(ll x)
{
if(x!=)Hash[cnt++]=x;
}
int main()
{
int n;
cnt=;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%lld%lld",&q[i].t,&q[i].l,&q[i].r);
add(q[i].l-),add(q[i].l),add(q[i].l+);
add(q[i].r-),add(q[i].r),add(q[i].r+);
}
Hash[cnt++]=;
sort(Hash,Hash+cnt);
cnt=unique(Hash,Hash+cnt)-Hash;
// for(int i=0;i<cnt;i++)printf("%lld ",Hash[i]);
// puts("");
build(,cnt,);
for(int i=;i<n;i++)
{
int op=q[i].t;
int tel=lower_bound(Hash,Hash+cnt,q[i].l)-Hash;
int ter=lower_bound(Hash,Hash+cnt,q[i].r)-Hash;
update(tel+,ter+,q[i].t,,cnt,);
int ans=query(,cnt,);
// printf("%d %d %d\n",tel,ter,ans);
printf("%lld\n",Hash[ans-]);
}
return ;
}
/********************
1
2 854690110384167294 954215012997404774
********************/
Educational Codeforces Round 23F的更多相关文章
- [Educational Codeforces Round 16]E. Generate a String
[Educational Codeforces Round 16]E. Generate a String 试题描述 zscoder wants to generate an input file f ...
- [Educational Codeforces Round 16]D. Two Arithmetic Progressions
[Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...
- [Educational Codeforces Round 16]C. Magic Odd Square
[Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...
- [Educational Codeforces Round 16]B. Optimal Point on a Line
[Educational Codeforces Round 16]B. Optimal Point on a Line 试题描述 You are given n points on a line wi ...
- [Educational Codeforces Round 16]A. King Moves
[Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...
- Educational Codeforces Round 6 C. Pearls in a Row
Educational Codeforces Round 6 C. Pearls in a Row 题意:一个3e5范围的序列:要你分成最多数量的子序列,其中子序列必须是只有两个数相同, 其余的数只能 ...
- Educational Codeforces Round 9
Educational Codeforces Round 9 Longest Subsequence 题目描述:给出一个序列,从中抽出若干个数,使它们的公倍数小于等于\(m\),问最多能抽出多少个数, ...
- Educational Codeforces Round 37
Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
随机推荐
- Akka Essentials - 2
Actors Defining an actor class MyActor extends Actor { def receive = { } } In Scala, the receive blo ...
- JavaScript教程1
1.什么是 JavaScript? JavaScript 是一门跨平台.面向对象的动态的弱类型的轻量级解释型语言,是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言.应用于 HTML 文档能够在 ...
- 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里.源代码: https://github.com/Tencent/mars作者:男人链接:https://zhuanlan ...
- Redis四(Set操作)
1.Set操作 Set集合就是不允许重复的列表 集合操作(无序) sadd(name,values) 1 # name对应的集合中添加元素 scard(name) 1 获取name对应的集合中元素个数 ...
- python 2 和python 3的 区别
用户交互 input ps:python2:raw_input python3:input 在 python2里 print不需要加括号也可以打印 子python3里 print 必须加括号才能打印
- MAC mysql install
# linux 查看是否安装mysql rpm -qa |grep mysql yum 安装mysql yum -y install mysql-server 1 download ...
- Linux Shell编程 exit、break、continue
exit语句 在系统中exit 命令用于退出当前用户的登录状态.在 Shell 脚本中exit 语句是用来退出当前脚本. exit 的语法如下: exit [返回值] 如果在 exit 之后定义了返回 ...
- initrd.img的压缩(制作)及解压的过程
一.启动镜像initrd.img 文件类RedHat 系统从vmlinuz 核心引导后,会读取initrd.img 启动镜像.该文件中包含驱动模块等信息,是非常重要的文件.不同版本使用的格式不同.1. ...
- JavaScript返回顶部特效
样式: <style type="text/css"> /*返回顶部特效*/ a { border: none; text-decoration: none; outl ...
- HashMap的简单源码分析(看了大佬的源码,基于1.7) put方法
参考博客: https://blog.csdn.net/eson_15/article/details/51158865 hashMap中的几个关键属性 //默认初始容量是16,必须是2的幂 stat ...