noip2017集训测试赛(三) Problem B: mex [补档]
Description
给你一个无限长的数组,初始的时候都为0,有3种操作:
操作1是把给定区间[l,r][l,r] 设为1,
操作2是把给定区间[l,r][l,r] 设为0,
操作3把给定区间[l,r][l,r] 0,1反转。
一共n个操作,每次操作后要输出最小位置的0。
Input
第一行一个整数n,表示有n个操作
接下来n行,每行3个整数op,l,r表示一个操作
Output
共n行,一行一个整数表示答案
Sample Input
3
1 3 4
3 1 6
2 1 3
Sample Output
1
3
1
HINT
对于30%的数据\(1≤n≤10^3,1≤l≤r≤10^{18}1≤n≤10^3,1≤l≤r≤10^{18}\)
对于100%的数据\(1≤n≤10^5,1≤l≤r≤10^{18}1≤n≤10^5,1≤l≤r≤10^{18}\)
Solution
正解时空复杂度为\(O(n \log n)\).
我的解法时空复杂度也是\(O(n \log n)\)
但是它就是MLE了那么一点.
正解: 离散化 + 线段树.
我的做法: 开两棵离散线段树, 分别代表0和1, 每次把一棵中的一些点拆下来放到另一棵里面.
/*
mind the value of INF
*/
#include <cstdio>
#include <cctype>
namespace Zeonfai
{
    inline long long getInt()
    {
        long long a = 0, sgn = 1; char c;
        while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;
        while(isdigit(c)) a = a * 10 + c - '0', c = getchar();
        return a * sgn;
    }
}
const long long INF = (long long)1e18 + 7;
// const long long INF = 11;
struct segmentTree
{
    struct node
    {
        node *suc[2];
        long long L, R;
        long long vst, sz;
        inline node(long long _L, long long _R)
        {
            L = _L; R = _R; vst = 0; sz = R - L + 1;
            for(long long i = 0; i < 2; ++ i) suc[i] = NULL;
        }
    }*rt;
    struct result
    {
        node *a, *b;
        inline result(node *_a, node *_b) {a = _a; b = _b;}
    };
    inline void initialize() {rt = new node(1, INF);}
    result split(node *u, long long L, long long R)
    {
        if(u == NULL || (u->L >= L && u->R <= R)) return result(u, NULL);
        long long mid = u->L + u->R >> 1;
        if(! u->vst)
        {
            u->suc[0] = new node(u->L, mid); u->suc[1] = new node(mid + 1, u->R);
            u->vst = 1;
        }
        node *_u = new node(u->L, u->R); _u->vst = 1;
        if(L <= mid)
        {
            result res = split(u->suc[0], L, R);
            _u->suc[0] = res.a; u->suc[0] = res.b;
        }
        if(R > mid)
        {
            result res = split(u->suc[1], L, R);
            _u->suc[1] = res.a; u->suc[1] = res.b;
        }
        u->sz = 0;
        for(long long i = 0; i < 2; ++ i) if(u->suc[i] != NULL) u->sz += u->suc[i]->sz;
        _u->sz = 0;
        for(long long i = 0; i < 2; ++ i) if(_u->suc[i] != NULL) _u->sz += _u->suc[i]->sz;
        return result(_u, u);
    }
    inline node* split(long long L, long long R)
    {
        result res = split(rt, L, R);
        rt = res.b; return res.a;
    }
    inline node* merge(node *u, node *_u)
    {
        if(u == NULL) return _u; if(_u == NULL) return u;
        for(long long i = 0; i < 2; ++ i) u->suc[i] = merge(u->suc[i], _u->suc[i]);
        u->sz = 0;
        for(long long i = 0; i < 2; ++ i) if(u->suc[i] != NULL) u->sz += u->suc[i]->sz;
        delete _u; return u;
    }
    inline void merge(node *u) {rt = merge(rt, u);}
    long long query(node *u)
    {
        if(! u->vst) return u->L;
        else if(u->suc[0] != NULL && u->suc[0]->sz) return query(u->suc[0]);
        else return query(u->suc[1]);
    }
    inline long long query() {return query(rt);}
}seg[2];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("mex.in", "r", stdin);
    freopen("mex.out", "w", stdout);
#endif
    using namespace Zeonfai;
    seg[0].initialize();
    long long n = getInt();
    for(long long i = 0; i < n; ++ i)
    {
        long long opt = getInt(); long long L = getInt(), R = getInt();
        if(opt == 1) seg[1].merge(seg[0].split(L, R));
        else if(opt == 2) seg[0].merge(seg[1].split(L, R));
        else if(opt == 3)
        {
            segmentTree::node *u = seg[0].split(L, R), *v = seg[1].split(L, R);
            seg[0].merge(v); seg[1].merge(u);
        }
        printf("%lld\n", seg[0].query());
    }
}
noip2017集训测试赛(三) Problem B: mex [补档]的更多相关文章
- noip2017集训测试赛(三)Problem C: MST
		题面 Description 给定一个n个点m条边的连通图,保证没有自环和重边.对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成树上.假如最大权值为无限大, ... 
- noip2017集训测试赛(十一)Problem C: 循环移位
		题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 ... 
- noip2017集训测试赛(六)Problem A: 炮艇大赛之正式赛
		题目描述 给定一个长度为\(L \le 10^9\)的环形赛道, \(n \le 10^5\)个人在上面赛艇. 每个人的速度都不相同, 假如为正则顺时针走, 否则逆时针走. 当两个人相遇时, 他们就会 ... 
- noip2017集训测试赛(四)Problem A: fibonacci
		题目大意 给你一个序列\(a_1, a_2, ..., a_n\). 我们令函数\(f(n)\)表示斐波那契数列第\(n\)项的值. 总共\(m\)个操作, 分为以下两种: 将\(x \in [L, ... 
- noip2019集训测试赛(二十一)Problem B: 红蓝树
		noip2019集训测试赛(二十一)Problem B: 红蓝树 Description 有一棵N个点,顶点标号为1到N的树.N−1条边中的第i条边连接顶点ai和bi.每条边在初始时被染成蓝色.高桥君 ... 
- BZOJ 4543 2016北京集训测试赛(二)Problem B: thr 既 长链剖分学习笔记
		Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ... 
- BZOJ 4543 2016北京集训测试赛(二)Problem B: thr
		Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ... 
- noip2019集训测试赛(二十一)Problem A: Colorful Balls
		Problem A: Colorful Balls Description Snuke放了N个一排彩色的球.从左起第i个球的颜色是ci重量是wi她可以通过执行两种操作对这些球重新排序操作1:选择两个相 ... 
- 2016集训测试赛(二十六)Problem A: bar
		Solution 首先审清题意, 这里要求的是子串而不是子序列... 我们考虑用1表示p, -1表示j. 用sum[i]表示字符串前\(i\)的前缀和. 则我们考虑一个字符串\([L, R]\)有什么 ... 
随机推荐
- Linux Top 命令参数解析
			转载自:http://www.jb51.net/LINUXjishu/34604.html TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户 ... 
- Struts2 利用拦截器 interceptor 控制登陆和访问权限
			最近学习了Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultSta ... 
- 【洛谷 P4886】 快递员 (点分治)
			这题因为一些小细节还是\(debug\)了很久...不过我第一次用脚本对拍,不亏. 先随便找一个点作为根,算出答案,即所有点对到这个点的距离和的最大值,并记录所有距离最大的点对.如果这个点在任意一个距 ... 
- Chrome扩展及应用开发
			Chrome扩展及应用开发(电子书) http://www.ituring.com.cn/minibook/950 文档 官方 https://developer.chrome.com/extensi ... 
- Long类型的坑,第一次遇见
			注意下面标红的code,如果不加这段代码会有问题,原因是一个比较的是地址,一个比较的是value,会导致不同,程序逻辑出错!加上后比较的就是值!!! allViewMap.put("proj ... 
- 3.flask视图进阶
			1.add_url_rule和app.route原理剖析 from flask import Flask app = Flask(__name__) # 下面是我们定义一个路由和对应视图的常用方法 ' ... 
- ipad/iphone中的前端调试
			需要在ipad上调试代码, 经过一番搜索(多在google搜到的), 稍微整理下 : ). 1. Settings -> Safari -> Advanced/Developer -> ... 
- KVM的qemu-kvm使用
			KVM: kvm,x86支持硬件辅助虚拟化技术(hvm) grep -E "(vmx|svm)" /proc/cpuinfo [root@dmsag ~]# ll /dev/kvm ... 
- jQuery 特殊选择器this
			特殊选择器this 相信很多刚接触jQuery的人,很多都会对$(this)和this的区别模糊不清,那么这两者有什么区别呢? this是JavaScript中的关键字,指的是当前的上下文对象,简单的 ... 
- iPhone手机关闭ios10自动更新
			在手机上打开safari,地址栏输入:https://oldcat.me/web/NOOTA9.mobileconfig然后回车按照要求安装此provision文件即可,然后重启.桌面出现一个反馈感叹 ... 
