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. jQuery EasyUI 简介

    简介 jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件. 特点: ①easyui 是一个基于 jQuery 的框架,集成了各种用户界面插件. ②easyui 提供建 ...

  2. 解决ubuntu 无法挂载移动硬盘问题 unknown filesystem type 'exfat'

    Ubuntu 13.10 或以上 安装exfat-fuse: sudo apt-get install exfat-fuse Ubuntu 13.04 或以下 sudo apt-add-reposit ...

  3. js中的整除运算

      Math.ceil(count / pagesize); //向上整除 4/3=2;   Math.floor(count / pagesize); //向下整除 4/3=1; Math.roun ...

  4. Spring-Spring概述

    Spring概述 Spring是最受欢迎的企业级Java应用程序开发框架.数以百万的来自世界各地的开发人员使用Spring框架来创建好性能.易于测试.可重用的代码. Spring框架是一个开源的Jav ...

  5. sql 基础查询集锦

    授权 GRANT All ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED ...

  6. struts 文件下载 annotation 注解版

    [本文简介] 本文将简单介绍使用 struts2 ,通过零配置和 annotation 实现文件下载功能. [文件夹结构] [web.xml有关struts的配置] <filter> &l ...

  7. 0505-Hystrix保护应用-Turbine集群状态监控

    https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_turbine

  8. ceshi1

    图片素材

  9. 关于shared pool的深入探讨(六)-高Latch竞争案例

    研究了几天shared pool,没想到忽然就撞到问题上来了.作为一个案例写出来给大家参考一下吧. 问题起因是公司做短信群发,就是那个18万买的4000字的短信小说(嘘,小声点,我也没看过...).群 ...

  10. python连接mongo

    连接mongodb数据库 用到pymongo模块 应该是这样来使用: , 'goods') 然后连接数据库层这么写 def getSpinfo(item,value,depart,comp): res ...