#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 998244353; constint N = 3e5 + 10; int T; int n, m; int w[N]; ll a[N]; intmain(){ scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++)scanf("%lld", &a[i]); for (int i = 1; i <= m; i++)scanf("%d", &w[i]); sort(a + 1, a + n + 1); sort(w + 1, w + m + 1, greater<int>()); ll ans = 0; int p = 1; for (int i = 1; i <= m && w[i] > 1; i++) { ans += a[p]; p = p + w[i] - 1; } int cnt = 0; for (int i = 1; i <= m; i++)if (w[i] == 1)cnt++; for (int i = 0; i < cnt; i++)ans += a[n - i]; for (int i = n; i >= n - m + 1; i--)ans += a[i]; printf("%lld\n", ans); } return0; }
D. TediousLee
题意:leivel i 由 level i-1 的图形叶节点生长一个儿子,有一个儿子的节点生长2个儿子,得到。多次询问,问一个level的图上有几个不相交的爪形。
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9 + 7; constint N = 2e5 + 10; int n, m; int w[N]; set<int>st[N]; queue<int>q; stack<int>ans; int vis[N], cle[N], x[N], y[N]; intmain(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++)scanf("%d", &w[i]); for (int i = 1; i <= m; i++) { scanf("%d%d", &x[i], &y[i]); st[x[i]].insert(i); st[y[i]].insert(i); } for (int i = 1; i <= n; i++) { if ((int)st[i].size() <= w[i])q.push(i), cle[i] = 1; } while (!q.empty()) { int t = q.front(); q.pop(); for (int u : st[t]) { if (!vis[u]) { vis[u] = 1; ans.push(u); if (!cle[x[u]]) { st[x[u]].erase(u); if((int)st[x[u]].size()<=w[x[u]])q.push(x[u]), cle[x[u]] = 1; } if (!cle[y[u]]) { st[y[u]].erase(u); if ((int)st[y[u]].size() <= w[y[u]])q.push(y[u]), cle[y[u]] = 1; } } } } for (int i = 1; i <= m; i++)if (!vis[i]) { puts("DEAD"); return0; } puts("ALIVE"); while (!ans.empty()) { printf("%d ", ans.top()); ans.pop(); } return0; }
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9 + 7; constint N = 2e5 + 10; int n; ll s[N], t[N]; bool can[N][2]; intck(int x){ for (int i = n; i > 1; i--) { if (can[i][x])x = 0; else x = 1; } return can[1][x]; } booldfs(ll s, ll t){ if (t & 1) { if (s & 1)returnfalse; elsereturntrue; } else { if (s > t / 2) { if (s & 1)returntrue; elsereturnfalse; } elseif (s > t / 4 && s <= t / 2)returntrue; elsereturndfs(s, t / 4); } } booldfs2(ll s, ll t){ if (s > t / 2)returntrue; elsereturndfs(s, t / 2); } intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++)scanf("%lld%lld", &s[i], &t[i]); for (int i = 1; i <= n; i++) { can[i][1] = dfs(s[i], t[i]); can[i][0] = dfs2(s[i], t[i]); } printf("%d %d\n", ck(1), ck(0)); return0; }