首页 > 代码库 > BZOJ1803 Spoj1487 Query on a tree III
BZOJ1803 Spoj1487 Query on a tree III
求子树第k大。。。
对dfs序记时间戳,然后建主席树。。。
不要问我为什么1WA,蒟蒻已经哭晕在厕所T T
(原因是。。。输出了seq[query]...明明是a[query].w 叫你不仔细想2333)
1 /************************************************************** 2 Problem: 1803 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:552 ms 7 Memory:28936 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 13 using namespace std; 14 const int N = 100005; 15 const int M = 20 * N; 16 17 struct data { 18 int key, w; 19 data() {} 20 data(int _k, int _w) : key(_k), w(_w) {} 21 22 inline bool operator < (const data &x) const { 23 return key < x.key; 24 } 25 } a[N]; 26 27 struct edge { 28 int next, to; 29 edge() {} 30 edge(int _n, int _t) : next(_n), to(_t) {} 31 } e[N << 1]; 32 33 struct tree_node { 34 int fa, v, st, ed; 35 } tr[N]; 36 37 struct seg_node { 38 int lson, rson, cnt; 39 } seg[M]; 40 41 int n; 42 int tot, first[N]; 43 int cnt_seq, cnt_seg; 44 int root[N]; 45 46 inline int read() { 47 int x = 0; 48 char ch = getchar(); 49 while (ch < ‘0‘ || ‘9‘ < ch) 50 ch = getchar(); 51 while (‘0‘ <= ch && ch <= ‘9‘) { 52 x = x * 10 + ch - ‘0‘; 53 ch = getchar(); 54 } 55 return x; 56 } 57 58 void Add_Edges(int x, int y) { 59 e[++tot] = edge(first[x], y), first[x] = tot; 60 e[++tot] = edge(first[y], x), first[y] = tot; 61 } 62 63 #define mid (l + r >> 1) 64 void modify(int &p, int l, int r, int pos) { 65 seg[++cnt_seg] = seg[p], p = cnt_seg, ++seg[p].cnt; 66 if (l == r) return; 67 if (pos <= mid) modify(seg[p].lson, l, mid, pos); 68 else modify(seg[p].rson, mid + 1, r, pos); 69 } 70 71 int query(int i, int j, int rank) { 72 i = root[i], j = root[j]; 73 int l = 1, r = n; 74 while (l != r) { 75 if (seg[seg[j].lson].cnt - seg[seg[i].lson].cnt >= rank) 76 r = mid, i = seg[i].lson, j = seg[j].lson; 77 else { 78 rank -= seg[seg[j].lson].cnt - seg[seg[i].lson].cnt; 79 l = mid + 1, i = seg[i].rson, j = seg[j].rson; 80 } 81 } 82 return l; 83 } 84 #undef mid 85 86 void dfs(int p) { 87 int x, y; 88 tr[p].st = ++cnt_seq, root[cnt_seq] = root[cnt_seq - 1]; 89 modify(root[cnt_seq], 1, n, tr[p].v); 90 for (x = first[p]; x; x = e[x].next) 91 if ((y = e[x].to) != tr[p].fa) { 92 tr[y].fa = p; 93 dfs(y); 94 } 95 tr[p].ed = cnt_seq; 96 } 97 98 int main() { 99 int i, k, Q;100 n = read();101 for (i = 1; i <= n; ++i)102 a[i] = data(read(), i);103 sort(a + 1, a + n + 1);104 for (i = 1; i <= n; ++i)105 tr[a[i].w].v = i;106 for (i = 1; i < n; ++i)107 Add_Edges(read(), read());108 dfs(1);109 110 Q = read();111 while (Q--) {112 i = read(), k = read();113 printf("%d\n", a[query(tr[i].st - 1, tr[i].ed, k)].w);114 }115 return 0;116 }
BZOJ1803 Spoj1487 Query on a tree III
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。