PKU 2528 Mayor's posters

第三次写这个题了,这次不再用线段树,因为估计了暴力能过(复杂度的估计不太明显,最坏不超过10^8,实际很可能更低或者大部分情况下更低(O(n)))!

235ms,超时了几次,猜测是因为memset,所以加了个位优化,AC。

 1 # include <stdio.h>
 2 # include <stdlib.h>
 3 # include <string.h>
 4 
 5 # define id(x) ((x)>>3)
 6 # define of(x) ((x)&0x7)
 7 # define get(x) ((h[id(x)]>>of(x)) & 0x1)
 8 # define set(x) (h[id(x)] |= (0x1 << of(x)))
 9 
10 # define MAXN 10005
11 
12 int n, m, cols;
13 int l[MAXN], r[MAXN];
14 int p[MAXN << 2];
15 short c[MAXN << 2];
16 char h[(MAXN >> 3) + 5];
17 
18 /***************************************************************/
19 int bins(int *v, int k)
20 {
21     int high = m-1, low = 0, mid;
22     
23     while (low < high)
24     {
25         mid = low + ((high-low)>>1);
26         if (v[mid] == k) return mid;
27         else if (v[mid] > k) high = mid - 1;
28         else low = mid + 1;
29     }
30     return low;
31 }
32 
33 int cmp(const void *x, const void *y)
34 {
35     return *(int*)x - *(int*)y;
36 }
37 
38 /***************************************************************/
39 void solve(void)
40 {
41     int x, y, i, j, ans;
42     
43     cols = 1;
44     memset(c, 0, sizeof(c[0])*(m>>3));
45     for (i = 0; i < n; ++i, ++cols)
46     {
47         x = bins(p, l[i]), y = bins(p, r[i]);
48         for (j = x; j <= y; ++j) c[j] = cols;
49     }
50     ans = 0;
51     memset(h, 0, sizeof(char)*((n+8)>>3));
52     for (i = 0; i < m+5; ++i)
53     {
54         if (c[i] && !get(c[i])) set(c[i]), ++ans;
55     }
56     printf("%d\n", ans);
57 }
58 
59 int main()
60 {
61     int T, i, k;
62     
63     scanf("%d", &T);
64     while (T--)
65     {
66         m = 0;
67         scanf("%d", &n);
68         for (i = 0; i < n; ++i)
69         {
70             scanf("%d%d", &l[i], &r[i]);
71             p[m++] = l[i], p[m++] = r[i];
72         }
73         qsort(p, m, sizeof(p[0]), cmp);
74         k = m, m = 1;
75         for (i = 1; i < k; ++i)
76             if (p[i] == p[m-1]) continue;
77             else p[m++] = p[i];
78         k = m;
79         for (i = 1; i < k; ++i)
80             if (p[i] != p[i-1]+1) p[m++] = p[i-1]+1;
81         qsort(p, m, sizeof(p[0]), cmp);
82         solve();
83     }
84     
85     return 0;
86 }
原文地址:https://www.cnblogs.com/JMDWQ/p/2647165.html