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 ...
随机推荐
- python系列十七:Python3 标准库概览
#!/usr/bin/python #-*-coding:gbk-*- #Python3 标准库概览'''操作系统接口os模块提供了不少与操作系统相关联的函数.建议使用 "import os ...
- django中的setting全局变量的导入
需求:在py文件中导入settings.py中的变量BASE_DIR settings.py文件 import os # Build paths inside the project like thi ...
- android studio本地gradle
1.从网站上下载http://services.gradle.org/distributions/ 2.打开工程里的gradle-wrapper.properties, distributionUrl ...
- Java读写.properties文件实例,解决中文乱码问题
package com.lxk.propertyFileTest; import java.io.*; import java.util.Properties; /** * 读写properties文 ...
- shell脚本调用传参【转载】
转自:https://www.cnblogs.com/cisum/p/8010658.html 1.直接使用$0,$1,$2,$3 $0是脚本的名字,就是按顺序来 #!/bin/bash # auth ...
- java多线程总结(一)
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: 1 2 3 4 5 6 7 8 9 10 11 ...
- 再谈WinIO初始化异常
再谈WinIO初始化异常 前段时间WinIO在我的新项目中总是初始化失败,有时候又是好好的,很让人费解.修改了源代码显示了很多调试信息后,也没有什么太多的收获.由于我们的工控卡必须要用这个库, ...
- s5_day13作业
#对之前文件进行的增删改查操作实现日志操作,日志输出用户进行过的操作. def log(): import logging logger_obj=logging.getLogger() logger_ ...
- Nodejs学习计划
此文章已经发表于本人博客. 由于公司要求这段时间在学习Nodejs,基本靠自摸一路走来踩了很多坑浪费很多时间,今天就来这里说下,顺便计划一下接下来的学习计划,目前自己做个博客,项目过程中学习了js类以 ...
- poj2996
/*排序函数要写对,优先级:K,Q,R,B,N,P 白色的:如果优先级一样,那么按照行数大的优先,如果行数一样,那么列数小的优先 黑色的:如果优先级一样,那么按照行数小的优先,如果行数一样,那么列数小 ...