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的更多相关文章

  1. [Educational Codeforces Round 16]E. Generate a String

    [Educational Codeforces Round 16]E. Generate a String 试题描述 zscoder wants to generate an input file f ...

  2. [Educational Codeforces Round 16]D. Two Arithmetic Progressions

    [Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...

  3. [Educational Codeforces Round 16]C. Magic Odd Square

    [Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...

  4. [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 ...

  5. [Educational Codeforces Round 16]A. King Moves

    [Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...

  6. Educational Codeforces Round 6 C. Pearls in a Row

    Educational Codeforces Round 6 C. Pearls in a Row 题意:一个3e5范围的序列:要你分成最多数量的子序列,其中子序列必须是只有两个数相同, 其余的数只能 ...

  7. Educational Codeforces Round 9

    Educational Codeforces Round 9 Longest Subsequence 题目描述:给出一个序列,从中抽出若干个数,使它们的公倍数小于等于\(m\),问最多能抽出多少个数, ...

  8. Educational Codeforces Round 37

    Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...

  9. 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 ...

随机推荐

  1. 面向对象 - 封装/property - 总结

    面向对象 - 封装: 封装:在类定义阶段,以__开头的属性名发生了变形 eg: __x --> _A__x / __foo --> _A__foo 1.特点: 1.在类外部无法直接访问 _ ...

  2. 以K个为一组反转单链表,最后不足K个节点的部分也反转

    package StackMin.ReverseList_offer16; public class ReverseKgroup_extend_offer16 { /** * 分组反转单链表,最后不足 ...

  3. HTTP请求 蜘蛛的 user-agent

    百度爬虫 * Baiduspider+(+http://www.baidu.com/search/spider.htm”) google爬虫 * Mozilla/5.0 (compatible; Go ...

  4. Win10 jdk的安装以及环境变量的配置,及需要注意的坑

    此篇文章献给自己,希望下次长点记性 最近本人终于有时间开始学习appium,并且开始在电脑上配置环境,第一步就是在我那刚装的Win10 系统上安装jdk,过程并不顺利,由于之前都是用的win7,几乎都 ...

  5. 解决Object() takes on paramenters的问题

    先贴上今天的代码: 解决:是由于父类中的_init_()写成了_int_(),由于粗心导致,下次注意.

  6. JAVA三框架工作原理是什么?

    一.struts的工作原理: 1.初始化,读取struts-config.xml.web.xml等配置文件(所有配置文件的初始化) 2.发送HTTP请求,客户端发送以.do结尾的请求 3.填充Form ...

  7. java 中JFinal getModel方法和数据库使用出现问题解决办法

    JFinal getModel方法(从页面表单中获取Model对象)+数据库存储问题 一.getmodel方法 1.在JConfig配置类中的数据库映射(存储到数据库时需要此配置) public vo ...

  8. Visio Yoeman

    Visio需要确定文件位置才能运行的 Yo主要是用来生成框架的,相当于是一个框架生成器 new install -g generator-django 然后在Visio按F5,选择要创建的环境,就可以 ...

  9. 常用模块(hashlib,configparser,logging)

    常用模块(hashlib,configparser,logging) hashlib hashlib 摘要算法的模块md5 sha1 sha256 sha512摘要的过程 不可逆能做的事:文件的一致性 ...

  10. 09 Spring框架 AOP (二) 高级用法

    上一篇文章我们主要讲了一点关于AOP编程,它的动态考虑程序的运行过程,和Spring中AOP的应用,前置通知,后置通知,环绕通知和异常通知,这些都是Spring中AOP最简单的用法,也是最常用的东西, ...