CDOJ 1259 昊昊爱运动 II bitset+线段树

题目链接

昊昊喜欢运动

他N天内会参加M种运动(每种运动用一个[1,m]的整数表示)

现在有Q个操作,操作描述如下

  • 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m])
  • 问昊昊第l天到第r天参加了多少种不同的运动

Input

输入两个数N, M (1≤N≤105, 1≤M≤100);

输入N个数ai(ai∈[1,m])表示在第i天昊昊做了第ai类型的运动;

输入一个数Q(1≤Q≤105);

输入Q行 每行描述以下两种操作

  • 形如M l r x,表示昊昊把第l天到第r天的运动全部换成了x(x∈[1,m])
  • 形如Q l r,表示昊昊想知道他第l天到第r天参加了多少种不同的运动

Output

对于所有的Q操作,每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动

Sample input and output

Sample Input Sample Output
5 3
1 2 3 2 3
4
Q 1 4
Q 2 4
M 5 5 2
Q 1 5
3
2
3

每一个节点开一个bitset维护就可以, 区间更新区间查询。

  1 #include <iostream>
  2 #include <vector>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <cmath>
  7 #include <map>
  8 #include <set>
  9 #include <string>
 10 #include <queue>
 11 #include <stack>
 12 #include <bitset>
 13 using namespace std;
 14 #define pb(x) push_back(x)
 15 #define ll long long
 16 #define mk(x, y) make_pair(x, y)
 17 #define lson l, m, rt<<1
 18 #define mem(a) memset(a, 0, sizeof(a))
 19 #define rson m+1, r, rt<<1|1
 20 #define mem1(a) memset(a, -1, sizeof(a))
 21 #define mem2(a) memset(a, 0x3f, sizeof(a))
 22 #define rep(i, n, a) for(int i = a; i<n; i++)
 23 #define fi first
 24 #define se second
 25 typedef pair<int, int> pll;
 26 const double PI = acos(-1.0);
 27 const double eps = 1e-8;
 28 const int mod = 1e9+7;
 29 const int inf = 1061109567;
 30 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
 31 const int maxn = 1e5+5;
 32 int lazy[maxn<<2], a[maxn<<2];
 33 bitset <105> s[maxn<<2];
 34 void pushUp(int rt) {
 35     s[rt] = s[rt<<1]|s[rt<<1|1];
 36 }
 37 void pushDown(int rt) {
 38     if(lazy[rt]) {
 39         lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt];
 40         a[rt<<1] = a[rt<<1|1] = lazy[rt];
 41         s[rt<<1].reset();
 42         s[rt<<1|1].reset();
 43         s[rt<<1][lazy[rt]] = s[rt<<1|1][lazy[rt]] = 1;
 44         lazy[rt] = 0;
 45         return ;
 46     }
 47 }
 48 void build(int l, int r, int rt) {
 49     if(l == r) {
 50         scanf("%d", &a[rt]);
 51         lazy[rt] = 0;
 52         s[rt][a[rt]] = 1;
 53         return ;
 54     }
 55     int m = l+r>>1;
 56     build(lson);
 57     build(rson);
 58     pushUp(rt);
 59 }
 60 void update(int val, int L, int R, int l, int r, int rt) {
 61     if(L<=l&&R>=r) {
 62         a[rt] = val;
 63         s[rt].reset();
 64         s[rt][val] = 1;
 65         lazy[rt] = val;
 66         return ;
 67     }
 68     pushDown(rt);
 69     int m = l+r>>1;
 70     if(L<=m)
 71         update(val, L, R, lson);
 72     if(R>m)
 73         update(val, L, R, rson);
 74     pushUp(rt);
 75 }
 76 bitset<105> query(int L, int R, int l, int r, int rt) {
 77     if(L<=l&&R>=r) {
 78         return s[rt];
 79     }
 80     pushDown(rt);
 81     bitset<105> tmp;
 82     tmp.reset();
 83     int m = l+r>>1;
 84     if(L<=m)
 85         tmp |= query(L, R, lson);
 86     if(R>m)
 87         tmp |= query(L, R, rson);
 88     return tmp;
 89 }
 90 int main()
 91 {
 92     int q, n, m, x, y;
 93     char ch;
 94     cin>>n>>m;
 95     build(1, n, 1);
 96     cin>>q;
 97     while(q--) {
 98         scanf(" %c%d%d", &ch, &x, &y);
 99         if(ch == ‘Q‘)
100             printf("%d\n", query(x, y, 1, n, 1).count());
101         else {
102             int z;
103             scanf("%d", &z);
104             update(z, x, y, 1, n, 1);
105         }
106     }
107     return 0;
108 }
时间: 2024-08-10 21:28:06

CDOJ 1259 昊昊爱运动 II bitset+线段树的相关文章

CDOJ 1259 昊昊爱运动 II 线段树+bitset

昊昊爱运动 II 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了多少种不同的运动 Input 输入两个数N, M (1≤N≤105, 1≤M≤100); 输入N个数ai(ai∈[1,m])表示在第i天昊昊做了第ai类型的运动; 输入一个数Q(1≤Q≤105); 输入Q行 每行描述以下两种操作 形如M l r x,表示昊昊把第l天到第r天的运动全部换成了x

UESTC-1259 昊昊爱运动 II

昊昊爱运动 II Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了多少种不同的运动 Input 输入两个数N, M (1≤N≤105, 1≤M≤100); 输入N个数ai(ai∈[1,m])

HDU4509-湫湫系列故事——减肥记II(线段树)

湫湫系列故事--减肥记II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2395    Accepted Submission(s): 1018 Problem Description 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见- 但是没有什么能难倒高智商美女湫湫的,她决定另寻对策

spoj gss2 : Can you answer these queries II 离线&amp;&amp;线段树

1557. Can you answer these queries II Problem code: GSS2 Being a completist and a simplist, kid Yang Zhe cannot solve but get Wrong Answer from most of the OI problems. And he refuse to write two program of same kind at all. So he always failes in co

ZOJ--3574--Under Attack II【线段树+欧拉公式】

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3574 题意:一个坐标系,给出x1.x2限定左右边界,有n条直线,告诉每条直线的k和b,问在x1.x2区间内空间被直线分割成几部分 思路: 这道题是比赛时做的,AC之后发现别人都是用归并排序求逆序对数来解的. 说我的解法吧,首先拿到题的时候发现是划分区域这样的,第一下就想到了欧拉公式,但是n有30000,n^2找交点肯定要超时.土豪在纸上画了一下,一条直线必然在x1和

SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)

GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot solve but get Wrong Answer from most of the OI problems. And he refuse to write two program of same kind at all. So he always failes in contests. When

Codeforces 633G Yash And Trees bitset + 线段树

Yash And Trees 用bitset维护每个节点拥有哪些数. #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int&

HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便,我们将小时换成分钟,那么一天24小时,总共有1440分钟.顾我就可以把一天里的任意HH:MM时间换成分钟.就这样一天的时间就变成[0,1440]区间了. 因为所给的活动最多是5*10^5,如果把活动的时间在线段[0,1440]都修改,那么时间的复杂度最坏是O(5*10^5*1440). (1)方法一

【SPOJ - GSS2】Can you answer these queries II(线段树)

区间连续不重复子段最大值,要维护历史的最大值和当前的最大值,打两个lazy,离线 #include<cstdio> #include<cstring> #include<algorithm> #define maxn 150000 #define rep(i,l,r) for(int i=l;i<=r;i++) #define LL long long using namespace std; typedef struct { LL nmax,hmax,nlazy