HDU4251
http://acm.hdu.edu.cn/showproblem.php?pid=4251
1 using namespace std; 2 #define MAX 100007 3 struct node 4 { 5 int num[MAX]; 6 int val[MAX]; 7 }t[40]; 8 int srted[MAX]; 9 int n, m; 10 void build(int l, int r, int d) 11 { 12 if (l == r) return; 13 int mid = (l + r) >> 1; 14 int midd = srted[mid]; 15 int same = mid - l + 1, samed = 0, zn = l - 1, yn = mid, i; 16 for (i = l; i <= r; ++i) 17 { 18 if (t[d].val[i]<midd) 19 --same; 20 } 21 for (i = l; i <= r; ++i) 22 { 23 if (i == l) t[d].num[i] = 0; 24 else t[d].num[i] = t[d].num[i - 1]; 25 if (t[d].val[i]<midd) 26 { 27 ++t[d].num[i]; 28 t[d + 1].val[++zn] = t[d].val[i]; 29 } 30 else if (t[d].val[i]>midd) 31 { 32 t[d + 1].val[++yn] = t[d].val[i]; 33 } 34 else 35 { 36 if (samed<same) 37 { 38 ++samed; 39 ++t[d].num[i]; 40 t[d + 1].val[++zn] = t[d].val[i]; 41 } 42 else 43 t[d + 1].val[++yn] = t[d].val[i]; 44 } 45 } 46 build(l, mid, d + 1); 47 build(mid + 1, r, d + 1); 48 } 49 int query(int a, int b, int k, int l, int r, int d) 50 { 51 int p, q, m,mid; 52 if (a == b) 53 return t[d].val[a]; 54 mid = (l + r) >> 1; 55 int sx = t[d].num[a - 1], sy = t[d].num[b]; 56 if (a - 1<l) sx = 0; 57 if (sy - sx >= k) 58 return query(l + sx, l + sy - 1, k, l, mid, d + 1); 59 else 60 { 61 if (a == 1) 62 p = 0; 63 else 64 p = a - q - sx; 65 q = b - a + 1 - sy + sx; 66 m = k - sy + sx; 67 return query(mid + 1 + p, mid + p + q, m, mid + 1, r, d + 1); 68 } 69 } 70 int main() 71 { 72 int i, a, b, T, res; 73 while (cin >> n) 74 { 75 cout << "Case " << T << ":" << endl; 76 for (i = 1; i <= n; ++i) 77 { 78 cin >> srted[i]; 79 t[0].val[i] = srted[i]; 80 } 81 sort(srted + 1, srted + 1 + n); 82 build(1, n, 0); 83 cin >> m; 84 for (i = 1; i <= m; ++i) 85 { 86 cin >> a >> b; 87 res = query(a, b, (a + b) / 2 - a + 1, 1, n, 0); 88 cout << res << endl; 89 } 90 } 91 return 0; 92 }
浙公网安备 33010602011771号