第三次写这个题了,这次不再用线段树,因为估计了暴力能过(复杂度的估计不太明显,最坏不超过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 }