BZOJ3252 攻略

Orz hzwer

只要用堆就可以了,跪烂了。。。

话说那个什么ext的库真的能用嘛= =,反正我用了烂删除

结果Rank.3←_←

 1 /**************************************************************
 2     Problem: 3252
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:964 ms
 7     Memory:14036 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <algorithm>
12 #include <queue>
13  
14 using namespace std;
15 typedef long long ll;
16 const int N = 200005;
17  
18 struct edges {
19     int next, to;
20     edges() {}
21     edges(int _n, int _t) : next(_n), to(_t) {}
22 } e[N];
23  
24 struct data {
25     ll first;
26     int w;
27     data() {}
28     data(ll _f, int _w) : first(_f), w(_w) {}
29      
30     inline bool operator < (const data &b) const {
31         return first < b.first;
32     }
33 };
34  
35 int n, k;
36 int first[N], tot;
37 int v[N];
38 bool vis[N];
39 ll mx[N], ans;
40 priority_queue <data> h;
41  
42 inline int read() {
43     int x = 0, sgn = 1;
44     char ch = getchar();
45     while (ch < '0' || '9' < ch) {
46         if (ch == '-') sgn = -1;
47         ch = getchar();
48     }
49     while ('0' <= ch && ch <= '9') {
50         x = x * 10 + ch - '0';
51         ch = getchar();
52     }
53     return sgn * x;
54 }
55  
56 inline void add_edge(int x, int y) {
57     e[++tot] = edges(first[x], y);
58     first[x] = tot;
59 }
60  
61 void dfs(int p) {
62     int x, y;
63     for (x = first[p]; x; x = e[x].next)
64         dfs(y = e[x].to), mx[p] = max(mx[p], mx[y]);
65     mx[p] += v[p];
66     h.push(data(mx[p], p));
67 }
68  
69 void del(int p) {
70     int x, y;
71     vis[p] = 1;
72     for (x = first[p]; x; x = e[x].next) 
73         if (mx[y = e[x].to] == mx[p] - v[p]) {
74             del(y);
75             break;
76         }
77 }
78  
79 int main() {
80     int i, p, x, y;
81     n = read(), k = read();
82     for (i = 1; i <= n; ++i) v[i] = read();
83     for (i = 1; i < n; ++i) {
84         x = read(), y = read();
85         add_edge(x, y);
86     }
87     dfs(1);
88     for (; k && !h.empty(); --k) {
89         while (vis[h.top().w] && !h.empty()) h.pop();
90         if (h.empty()) break;
91         ans += mx[p = h.top().w];
92         del(p);
93     }
94     printf("%lld
", ans);
95     return 0;
96 }
View Code

 (p.s. 开了二逼读入以后就变成Rank.1了2333)

By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
原文地址:https://www.cnblogs.com/rausen/p/4127198.html