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 }

 

你可能感兴趣的:(post)