加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

2012 Multi-University Training Contest 7

发布时间:2020-12-14 03:23:13 所属栏目:大数据 来源:网络整理
导读:2012 Multi-University Training Contest 7 A.As long as Binbin loves Sangsang B.Dead or alive C.Dragon Ball D.Draw and paint E.Matrix operation F.Palindrome graph G.Successor 题意:给你一棵树,每个结点有两个属性值,1.能力值,2.忠诚度。然后m个

2012 Multi-University Training Contest 7

A.As long as Binbin loves Sangsang

B.Dead or alive

C.Dragon Ball

D.Draw and paint

E.Matrix operation

F.Palindrome graph

G.Successor

题意:给你一棵树,每个结点有两个属性值,1.能力值,2.忠诚度。然后m个询问,每次询问一个整数u,求u的子树中能力值大于u的且忠诚度最大的点的编号。

SOL:先按能力值排序,这样从大到小考虑就满足了条件1,然后从大到小依次在线段树里查询子树中忠诚度最大的点的编号,复杂度O(nlogn)。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 #define tl (p << 1)
  6 #define tr (p << 1 | 1)
  7 using namespace std;
  8 const int LEN = 1e5 + 5;
  9 int i,j,k,n,m,s,t,tot,Time;
 10 struct edge {
 11     int vet,next;
 12 } E[LEN * 2];
 13 struct node {
 14     int x,y,id;
 15 } a[LEN];
 16 bool cmp(const node &x,const node &y) {
 17     return x.x > y.x;
 18 };
 19 int head[LEN],size[LEN],tid[LEN],ans[LEN],pre[LEN],b[LEN];
 20 int to[1000005];
 21 int tmax[LEN * 4];
 22 void add(int u,int v) {
 23     E[++tot] = (edge){v,head[u]};
 24     head[u] = tot;
 25 }
 26 void dfs(int u) {
 27     size[u] = 1;
 28     tid[u] = ++Time;
 29     pre[Time] = u;
 30     for (int e = head[u]; e != -1; e = E[e].next) {
 31         int v = E[e].vet;
 32         dfs(v);
 33         size[u] += size[v];
 34     }
 35 }
 36 int ask(int l,int r,int x,int y,int p) {
 37     if (l == x && y == r) {
 38         return tmax[p];
 39     }
 40     int mid = (l + r) >> 1;
 41     if (mid >= y) {
 42         return ask(l,mid,x,tl);
 43     } else if (mid + 1 <= x) {
 44         return ask(mid + 1,r,tr);
 45     } else {
 46         return max(ask(l,tl),ask(mid + 1,mid + 1,tr));
 47     }
 48 }
 49 void update(int p) {
 50     tmax[p] = max(tmax[tl],tmax[tr]);
 51 }
 52 void modify(int l,const int &x,int p,const int &c) {
 53     if (l == r) {
 54         tmax[p] = c;
 55         return;
 56     }
 57     int mid = (l + r) >> 1;
 58     if (mid >= x) {
 59         modify(l,tl,c);
 60     } else {
 61         modify(mid + 1,tr,c);
 62     }
 63     update(p);
 64 }
 65 void build(int l,int p) {
 66     if (l == r) {
 67         tmax[p] = -1;
 68         return;
 69     }
 70     int mid = (l + r) >> 1;
 71     build(l,tl);
 72     build(mid + 1,tr);
 73     update(p);
 74 }
 75 int main() {
 76     int T;
 77     scanf("%d",&T);
 78     while (T--) {
 79         tot = Time = 0;
 80         scanf("%d %d",&n,&m);
 81         for (int i = 1; i <= n; i++) {
 82             head[i] = -1;
 83             size[i] = 0;
 84             tid[i] = 0;
 85         }
 86         a[1] = (node){1e9,0,1};
 87         for (int i = 2; i <= n; i++) {
 88             int fa,y;
 89             scanf("%d %d %d",&fa,&x,&y);
 90             x++,y++,fa++;
 91             swap(x,y);
 92             add(fa,i);
 93             a[i] = (node){x,i};
 94             to[y] = i;
 95         }
 96         dfs(1);
 97         build(1,1);
 98         sort(a + 1,a + 1 + n,cmp);
 99         int j = 1;
100         for (int i = 2; i <= n; i++) {
101             int x = a[i].id,t = ask(1,tid[x],tid[x] + size[x] - 1,1);
102             if (t == -1) {
103                 ans[x] = 0;
104             } else {
105                 ans[x] = to[t];
106             }
107             while (j + 1 <= i && a[j + 1].x > a[i + 1].x) {
108                 modify(1,tid[a[j + 1].id],1,a[j + 1].y);
109                 j++;
110             }
111         }
112         while (m--) {
113             int x;
114             scanf("%d",&x);
115             printf("%dn",ans[x + 1] - 1);
116         }
117     }
118     return 0;
119 }
View Code

H.The war of virtual world

I.Water World I

J.Water World II

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读