zoukankan      html  css  js  c++  java
  • 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
    ", a[query(tr[i].st - 1, tr[i].ed, k)].w);
    114     }
    115     return 0;
    116 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    Windows Live Writer 语法高亮
    二十一、Java基础--------IO流之综合案例分析
    二十、Java基础--------IO流之其他对象
    十九、Java基础--------IO流之字节流
    十八、Java基础--------IO流体系以及字符流
    十七、Java基础---------集合框架之Map
    十六、Java基础---------集合框架之Set
    十五、Java基础---------集合框架体系以及List
    十四、Java基础---------String、StringBuffer、StringBuilder基本应用
    十三、Java基础---------多线程总结
  • 原文地址:https://www.cnblogs.com/rausen/p/4162439.html
Copyright © 2011-2022 走看看