Codeforces Round #480 (Div. 2) E. The Number Games
The nation of Panel holds an annual show called The Number Games, where each district in the nation will be represented by one contestant.
The nation has nn districts numbered from
This year, the president decided to reduce the costs. He wants to remove kk contestants from the games. However, the districts of the removed contestants will be furious and will not allow anyone to cross through their districts.
The president wants to ensure that all remaining contestants are from districts that can be reached from one another. He also wishes to maximize the total number of fans of the participating contestants.
Which contestants should the president remove?
InputThe first line of input contains two integers
The next n?1n?1 lines each contains two integers aa and bb (1≤a,b≤n1≤a,b≤n, a≠ba≠b), that describe a road that connects two different districts aaand bb in the nation. It is guaranteed that there is exactly one path between every two districts.
OutputPrint kk space-separated integers: the numbers of the districts of which the contestants should be removed, in increasing order of district number.
Examples input Copy6 3output Copy
2 1
2 6
4 2
5 6
2 3
1 3 4input Copy
8 4output Copy
2 6
2 7
7 8
1 2
3 1
2 4
7 5
1 3 4 5Note
In the first sample, the maximum possible total number of fans is 22+25+26=10022+25+26=100. We can achieve it by removing the contestants of the districts 1, 3, and 4.
思路:貪心留最大的,樹上倍增求出花費,若可行,暴力更新路徑上所有未留下的點,否則判斷下一個。
1 #include <iostream> 2 #include <fstream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstdio> 6 #include <cmath> 7 #include <string> 8 #include <cstring> 9 #include <algorithm> 10 #include <queue> 11 #include <stack> 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <list> 16 #include <iomanip> 17 #include <cctype> 18 #include <cassert> 19 #include <bitset> 20 #include <ctime> 21 22 using namespace std; 23 24 #define pau system("pause") 25 #define ll long long 26 #define pii pair<int, int> 27 #define pb push_back 28 #define mp make_pair 29 #define clr(a, x) memset(a, x, sizeof(a)) 30 31 const double pi = acos(-1.0); 32 const int INF = 0x3f3f3f3f; 33 const int MOD = 1e9 + 7; 34 const double EPS = 1e-9; 35 36 /* 37 #include <ext/pb_ds/assoc_container.hpp> 38 #include <ext/pb_ds/tree_policy.hpp> 39 40 using namespace __gnu_pbds; 41 tree<pli, null_type, greater<pli>, rb_tree_tag, tree_order_statistics_node_update> T; 42 */ 43 44 int n, k, d[1000015], vis[1000015], p[1000015]; 45 vector<int> e[1000015], e1[1000015]; 46 int f[1000015][25]; 47 48 void dfs(int x) { 49 vis[x] = 1; 50 for (int i = 0; i < e[x].size(); ++i) { 51 int y = e[x][i]; 52 if (vis[y]) p[x] = y; 53 else { 54 e1[x].pb(y); 55 dfs(y); 56 } 57 } 58 } 59 60 void dfs2(int x) { 61 f[x][0] = p[x]; 62 for (int i = 1; i <= 20; ++i) { 63 f[x][i] = f[f[x][i - 1]][i - 1]; 64 } 65 for (int i = 0; i < e1[x].size(); ++i) { 66 int y = e1[x][i]; 67 dfs2(y); 68 } 69 } 70 vector<int> ans; 71 bool out[1000015]; 72 void solve() { 73 clr(vis, 0); vis[0] = 1; 74 int now = n; 75 while (k) { 76 if (vis[now]) { 77 --now; 78 continue; 79 } 80 int cnt = 1; 81 for (int h = 0, i = now; ; ) { 82 while (!vis[f[i][h]]) { 83 ++h; 84 } 85 while (~h && vis[f[i][h]]) { 86 --h; 87 } 88 if (~h) { 89 cnt += 1 << h; 90 i = f[i][h]; 91 } else { 92 break; 93 } 94 } 95 if (cnt <= k) { 96 int i = now; 97 while (!vis[i]) { 98 ans.pb(i); 99 vis[i] = 1; 100 i = p[i]; 101 } 102 k -= cnt; 103 } 104 --now; 105 } 106 for (int i = 0; i < ans.size(); ++i) { 107 out[ans[i]] = 1; 108 } 109 for (int i = 1; i <= n; ++i) { 110 if (!out[i]) printf("%d ", i); 111 } 112 } 113 int main() { 114 scanf("%d%d", &n, &k); 115 k = n - k; 116 for (int i = 1; i < n; ++i) { 117 int a, b; 118 scanf("%d%d", &a, &b); 119 e[a].pb(b), e[b].pb(a); 120 } 121 dfs(n); 122 dfs2(n); 123 solve(); 124 return 0; 125 }View Code
Codeforces Round #480 (Div. 2) E. The Number Games