[BZOJ2120] 数颜色 && [bzoj2453] 维护队列(莫队 || 分块)

传送门

只有第一个,第二个权限题。

 

分块,然而wa,没看出来错在哪里,有时间再看。

  1 #include <cmath>
  2 #include <cstdio>
  3 #include <iostream>
  4 #include <algorithm>
  5 
  6 const int N = 10001, M = 1000001;
  7 
  8 int n, m, S, C;
  9 int a[N], st[N], ed[N], belong[N], pre[N], last[M], c[N];
 10 
 11 inline int read()
 12 {
 13     int x = 0, f = 1;
 14     char ch = getchar();
 15     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
 16     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
 17     return x * f;
 18 }
 19 
 20 inline int min(int x, int y)
 21 {
 22     return x < y ? x : y;
 23 }
 24 
 25 inline int find(int x, int y, int z)
 26 {
 27     int mid, l = x;
 28     while(x < y)
 29     {
 30         mid = (x + y) >> 1; 
 31         if(c[mid] >= z) y = mid;
 32         else x = mid + 1;
 33     }
 34     return x - l;
 35 }
 36 
 37 inline void reset(int x)
 38 {
 39     int i;
 40     for(i = st[x]; i <= ed[x]; i++) c[i] = pre[i];
 41     std::sort(c + st[x], c + ed[x] + 1);
 42 }
 43 
 44 inline void init()
 45 {
 46     int i, j;
 47     n = read();
 48     m = read();
 49     S = sqrt(n);
 50     for(i = 1; i <= n; i++)
 51     {
 52         a[i] = read();
 53         pre[i] = last[a[i]];
 54         last[a[i]] = i;
 55     }
 56     for(i = 1; i <= n; i += S)
 57         st[++C] = i, ed[C] = min(i + S - 1, n);
 58     for(i = 1; i <= C; i++)
 59     {
 60         reset(i);
 61         for(j = st[i]; j <= ed[i]; j++) belong[j] = i;
 62     }
 63 }
 64 
 65 inline int query(int x, int y)
 66 {
 67     int i, l = belong[x], r = belong[y], ans = 0;
 68     if(l == r)
 69     {
 70         for(i = x; i <= y; i++) if(c[i] < x) ans++;
 71         return ans;
 72         //return std::lower_bound(c + x, c + y + 1, x) - c - x;
 73     }
 74     //ans += std::lower_bound(c + x, c + ed[l] + 1, x) - c - x;
 75     for(i = x; i <= ed[l]; i++) if(c[i] < x) ans++;
 76     for(i = l + 1; i <= r - 1; i++) ans += find(st[i], ed[i] + 1, x);
 77     //ans += std::lower_bound(c + st[r], c + y + 1, x) - c - st[r];
 78     for(i = st[r]; i <= y; i++) if(c[i] < x) ans++;
 79     return ans;
 80 }
 81 
 82 inline void update(int x, int d)
 83 {
 84     int i, t;    
 85     for(i = 1; i <= n; i++) last[a[i]] = 0;
 86     a[x] = d;
 87     for(i = 1; i <= n; i++)
 88     {
 89         t = pre[i];
 90         pre[i] = last[a[i]];
 91         if(t ^ pre[i]) reset(belong[i]);
 92         last[a[i]] = i;
 93     }
 94 }
 95 
 96 inline void work()
 97 {
 98     int i, x, y;
 99     char ch[5];
100     for(i = 1; i <= m; i++)
101     {
102         scanf("%s", ch);
103         x = read();
104         y = read();
105         if(ch[0] == 'Q') printf("%d\n", query(x, y));
106         else update(x, y);
107     }
108 }
109 
110 int main()
111 {
112     init();
113     work();
114     return 0;
115 }
View Code

 

莫队

比分块不知道高到哪里去了。

带修改之后真是。。。。

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <algorithm>
 5 
 6 const int N = 10001, M = 1e6 + 5;
 7 int n, Q, S, cnt1, cnt2, cur, l = 1, r, now;
 8 int a[N], t[N], belong[N], ans[N], c[M];
 9 
10 struct ovo
11 {
12     int l, r, tim, id;
13     ovo(int l = 0, int r = 0, int tim = 0, int id = 0) : l(l), r(r), tim(tim), id(id) {}
14 }q[N];
15 struct qwq
16 {
17     int p, v, last;
18     qwq(int p = 0, int v = 0, int last = 0) : p(p), v(v), last(last) {}
19 }cq[N];
20 
21 inline int read()
22 {
23     int x = 0, f = 1;
24     char ch = getchar();
25     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
26     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
27     return x * f;
28 }
29 
30 inline bool cmp(ovo x, ovo y)
31 {
32     return belong[x.l] == belong[y.l] ? (belong[x.r] == belong[y.r] ? x.tim < y.tim : belong[x.r] < belong[y.r]) : belong[x.l] < belong[y.l];
33 }
34 
35 inline void add(int x)
36 {
37     now += (++c[x]) == 1;
38 }
39 
40 inline void del(int x)
41 {
42     now -= (--c[x]) == 0;
43 }
44 
45 inline void update(int x, int d)
46 {
47     if(l <= x && x <= r) add(d), del(a[x]);
48     a[x] = d;
49 }
50 
51 int main()
52 {
53     int i, x, y;
54     char ch[3];
55     n = read();
56     Q = read();
57     S = sqrt(n);
58     for(i = 1; i <= n; i++) a[i] = t[i] = read(), belong[i] = i / S + 1;
59     for(i = 1; i <= Q; i++)
60     {
61         scanf("%s", ch);
62         x = read();
63         y = read();
64         if(ch[0] == 'Q') q[++cnt1] = ovo(x, y, cnt2, cnt1);
65         else cq[++cnt2] = qwq(x, y, t[x]), t[x] = y;
66     }
67     std::sort(q + 1, q + cnt1 + 1, cmp);
68     for(i = 1; i <= cnt1; i++)
69     {
70         while(cur < q[i].tim) cur++, update(cq[cur].p, cq[cur].v);
71         while(cur > q[i].tim) update(cq[cur].p, cq[cur].last), cur--;
72         while(l < q[i].l) del(a[l]), l++;
73         while(l > q[i].l) l--, add(a[l]);
74         while(r < q[i].r) r++, add(a[r]);
75         while(r > q[i].r) del(a[r]), r--;
76         ans[q[i].id] = now;
77     }
78     for(i = 1; i <= cnt1; i++) printf("%d\n", ans[i]);
79     return 0;
80 }
View Code

 

posted @ 2017-05-25 16:57  zht467  阅读(91)  评论(0编辑  收藏  举报