Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries

题意:

一共有n个操作。

1.  将[l,r]区间的数标记为1。

2.  将[l,r]区间的数标记为0。

3.  将[l,r]区间取反。

对每个操作,输出标记为0的最小正整数。

题解:

hash后,用线段树xjb标记一下就行了。

 1 #include<bits/stdc++.h>
 2 #define ls l,m,rt<<1
 3 #define rs m+1,r,rt<<1|1
 4 #define F(i,a,b) for(int i=a;i<=b;++i)
 5 using namespace std;
 6 typedef long long ll;
 7
 8 const int N=4e5+7;
 9 int n,ed,sum[N<<2],lazy[N<<2];
10 ll hsh[N],mx;
11 struct Node
12 {
13     int type;
14     ll l,r;
15 }q[N];
16
17 void del(int rt)
18 {
19     if(lazy[rt]==1||lazy[rt]==2)lazy[rt]=(lazy[rt]==1?2:1);
20     else if(lazy[rt]==3)lazy[rt]=0;
21     else lazy[rt]=3;
22 }
23
24 void PD(int rt,int l,int r)
25 {
26     if(!lazy[rt])return;
27     int m=l+r>>1;
28     if(lazy[rt]==1)
29     {
30         sum[rt<<1]=m-l+1,sum[rt<<1|1]=r-m;
31         lazy[rt<<1]=lazy[rt<<1|1]=1;
32     }
33     else if(lazy[rt]==2)
34     {
35         sum[rt<<1]=sum[rt<<1|1]=0;
36         lazy[rt<<1]=lazy[rt<<1|1]=2;
37     }
38     else
39     {
40         sum[rt<<1]=(m-l+1)-sum[rt<<1],sum[rt<<1|1]=(r-m)-sum[rt<<1|1];
41         del(rt<<1),del(rt<<1|1);
42     }
43     lazy[rt]=0;
44 }
45
46 void PU(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}
47
48 void update(int L,int R,int v,int l=1,int r=ed,int rt=1)
49 {
50     if(L<=l&&r<=R)
51     {
52         if(v==1)sum[rt]=(r-l+1),lazy[rt]=1;
53         else if(v==2)sum[rt]=0,lazy[rt]=2;
54         else del(rt),sum[rt]=(r-l+1)-sum[rt];
55         return;
56     }
57     PD(rt,l,r);
58     int m=l+r>>1;
59     if(L<=m)update(L,R,v,ls);
60     if(R>m)update(L,R,v,rs);
61     PU(rt);
62 }
63
64 int query(int l=1,int r=ed,int rt=1)
65 {
66     if(l==r)return l;
67     int m=l+r>>1;
68     PD(rt,l,r);
69     if(m-l+1-sum[rt<<1])return query(ls);
70     else return query(rs);
71 }
72
73
74 int getid(ll x){return lower_bound(hsh+1,hsh+1+ed,x)-hsh;}
75
76 int main(){
77     scanf("%d",&n);
78     F(i,1,n)
79     {
80         scanf("%d%I64d%I64d",&q[i].type,&q[i].l,&q[i].r);
81         hsh[++ed]=q[i].l,hsh[++ed]=q[i].r;
82         hsh[++ed]=q[i].l+1,hsh[++ed]=q[i].r+1;
83     }
84     hsh[++ed]=1;
85     sort(hsh+1,hsh+1+ed),ed=unique(hsh+1,hsh+1+ed)-hsh-1;
86     F(i,1,n)
87     {
88         update(getid(q[i].l),getid(q[i].r),q[i].type);
89         printf("%I64d\n",hsh[query()]);
90     }
91     return 0;
92 }

时间: 2024-07-30 10:15:52

Educational Codeforces Round 23 F. MEX Queries(线段树)的相关文章

Educational Codeforces Round 6 E dfs序+线段树

题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili上电子科技大学发的视频学习的 将一颗树通过dfs编号的方式 使每个点的子树的编号连在一起作为相连的区间 就可以配合线段树搞子树 因为以前好像听说过 线段树可以解决一种区间修改和查询区间中不同的xx个数...所以一下子就想到了... 但是我不会写线段树..只会最简单的单点修改区间查询...不会用延迟标

Educational Codeforces Round 25 G. Tree Queries

题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一个操作是这个. 2 x 询问x到任意黑色的点的简单路径上的最小节点编号. 题解: 首先将一个变为黑色的点当成树根,然后dfs一下,预处理出所有点的答案. 然后开一个变量记录一下当前变黑的点的答案cur=min(cur,dp[x]). 每次询问的时候答案就是min(cur,dp[x]). 如果觉得很神

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.

Educational Codeforces Round 25 F. String Compression(kmp+dp)

题目链接:Educational Codeforces Round 25 F. String Compression 题意: 给你一个字符串,让你压缩,问压缩后最小的长度是多少. 压缩的形式为x(...)x(...)  x表示(...)这个出现的次数. 题解: 考虑dp[i]表示前i个字符压缩后的最小长度. 转移方程解释看代码,这里要用到kmp来找最小的循环节. 当然还有一种找循环节的方式就是预处理lcp,然后通过枚举循环节的方式. 这里我用的kmp找的循环节.复杂度严格n2. 1 #inclu

Educational Codeforces Round 23 E. Choosing The Commander (trie)

题目链接: Educational Codeforces Round 23 E. Choosing The Commander 题意: 一共有n个操作. 1.  插入一个数p 2.  删除一个数p 3.  询问有多少个数 使得 x^p<l 题解: 对于前两种操作用01trie就能解决. 对于对三个操作,我们考虑在trie上搜索. 1.  当l的bit位是1时,那边bit位是p的字数全部的数都会小于l,(因为p^p=0) 2.  当l的bit为是0时,那边只能向bit位是p的子树中搜. 这样算下来

Educational Codeforces Round 24 F. Level Generation(三分)

题目链接:Educational Codeforces Round 24 F. Level Generation 题意: 给你n个点,让你构造ans条边,使得这ans条边中至少有一半是桥. 让你求ans的最大值. 题解: 首先我们将每一个点按顺序连起来,那么可以构成n-1个桥. 然后我们可以把其中的x个点拿出来连边,这些边都不是桥. x个点最多能连x*(x-1)条边,然后剩下的n-x个点连的边将会构成桥. 然后就可以构造一个函数关系,详见check函数,然后三分一下就行了. 1 #include

Educational Codeforces Round 21 F. Card Game(网络流之最大点权独立集)

题目链接:Educational Codeforces Round 21 F. Card Game 题意: 有n个卡片,每个卡片有三个值:p,c,l; 现在让你找一个最小的L,使得满足选出来的卡片l<=L,并且所有卡片的p的和不小于k. 选择卡片时有限制,任意两张卡片的c之和不能为质数. 题解: 和hdu 1565 方格取数(2)一样,都是求最大点权独立集. 不难看出来,这题再多一个二分. 注意的是在构造二部图的时候,按照c值的奇偶性构造. 当c==1时要单独处理,因为如果有多个c==1的卡片,

Educational Codeforces Round 76 F 折半枚举

Educational Codeforces Round 76 F 折半枚举 https://codeforces.com/contest/1257/problem/F 题意: 数组a,找到一个x使得a中每一个元素异或x后"二进制中1的个数"相同. 数组长度100,数字大小2^30. 思路: 折半枚举答案X,如分为X前15位和后15位.之后我们再枚举期望的"相同个数"是多少,通过hash看看能不能满足就好了. 代码: #include <bits/stdc++

Nastya Hasn&#39;t Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)

题目链接 传送门 题面 题意 给你一个\(a\)数组和一个\(k\)数组,进行\(q\)次操作,操作分为两种: 将\(a_i\)增加\(x\),此时如果\(a_{i+1}<a_i+k_i\),那么就将\(a_{i+1}\)变成\(a_i+k_i\),如果\(a_{i+2}<a_i+k_i\),则将\(a_{i+2}\)变成\(a_{i+1}+k_{i+1}\),以此类推. 查询\(\sum\limits_{i=l}^{r}a_i\). 思路 我们首先存下\(k\)数组的前缀和\(sum1\),