Description
Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.Input
First line of input contains L (1 <= L <= 100000), T (1 <= T <= 30) and O (1 <= O <= 100000). Here O denotes the number of operations. Following O lines, each contains "C A B C" or "P A B" (here A, B, C are integers, and A may be larger than B) as an operation defined previously.Output
Ouput results of the output operation in order, each line contains a number.Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
看了網上不少的題解,感覺沒有那麼麻煩。。就是區間更新,每次統計數量的時候哈希一下就好,詳見代碼。
#include#include #include #include #include #define lson o << 1, l, m #define rson o << 1|1, m+1, r using namespace std; typedef long long LL; const int MAX = 0x3f3f3f3f; const int maxn = 100010; int n, a, b, c, t, q, ans; char s[3]; int cnt[maxn<<2], vis[35]; void down(int o) { if(cnt[o]) { cnt[o<<1] = cnt[o<<1|1] = cnt[o]; cnt[o] = 0; } } void build(int o, int l, int r) { cnt[o] = 1; if(l == r) return; int m = (l+r) >> 1; build(lson); build(rson); } void update(int o, int l, int r) { if(a <= l && r <= b) { cnt[o] = c; return; } down(o); int m = (l+r) >> 1; if(a <= m) update(lson); if(m < b ) update(rson); } void query(int o, int l, int r) { if(cnt[o]) { if(vis[ cnt[o] ] == 0) { ans ++; vis[ cnt[o] ] = 1; } return ; } int m = (l+r) >> 1; if(a <= m) query(lson); if(m < b ) query(rson); } int main() { scanf("%d%d%d", &n, &t, &q); build(1, 1, n); while(q--) { scanf("%s%d%d", s, &a, &b); if(a > b) swap(a, b); if(s[0] == 'C') { scanf("%d", &c); update(1, 1, n); } else { memset(vis, 0, sizeof(vis)); ans = 0; query(1, 1, n); printf("%d\n", ans); } } return 0; }