Codeforces Round #529 (Div. 3)錯過上分記
阿新 • • 發佈:2019-01-26
class 兩種 sin 每次 += scan 情況 add 就是
Codeforces Round #529 (Div. 3)錯過上分記
前言
這場比賽的題真的簡單,除了E題奇奇怪怪的前後綴和。
A
讀原字符,挑出裏面的字符輸出即可。
B
排個序,分類討論兩種情況馬上完事。
C
先貪心地用最少的次數把這個數分解掉,如果要求次數當然無解。
如果多的話一定有解,因為你可以一直分解,除非全是1的情況。
D
我本來以為是什麽歐拉回路,其實就是無腦的建圖。
一個點可以有兩個點選擇,要與前面不矛盾即可。
E
E題後面都不會做了。
這道題要有4個數組:
- int數組s1:一個前綴和,讀到左括號+1,讀到右括號-1。
- int數組s2:一個後綴和,讀到右括號+1,讀到左括號-1。
- bool數組b1:判斷左邊是否合法。
- bool數組b2:判斷右邊是否合法。
還是看代碼吧:
#include<cstdio> const int maxn = 1000005; char ch[maxn]; int n; int s1[maxn], s2[maxn]; bool b1[maxn], b2[maxn]; int main() { scanf("%d", &n); scanf("%s", ch + 1); for(int i = 1; i <= n; i++) { s1[i] = s1[i - 1] + (ch[i] == ‘(‘ ? 1 : -1); if(s1[i] >= 0) b1[i] = true; else break; } for(int i = n; i >= 1; i--) { s2[i] = s2[i + 1] + (ch[i] == ‘)‘ ? 1 : -1); if(s2[i] >= 0) b2[i] = true; else break; } int ans = 0; b1[0] = b1[n + 1] = b2[0] = b2[n + 1] = true; for(int i = 1; i <= n; i++) { if(b1[i - 1] && b2[i + 1]) { if(ch[i] == ‘(‘) { if(s1[i - 1] - 1 == s2[i + 1]) ans++; } else if(ch[i] == ‘)‘) { if(s1[i - 1] + 1 == s2[i + 1]) ans++; } } } printf("%d\n", ans); return 0; }
F
F題其實比E題簡單。
貪心的思想:從最小點權的點相連,每次的代價都是最小。
暴力建出這些邊,然後跑一個最小生成樹即可。
個人感覺還是挺優美的,把邊數特別多的省得只剩下\(n\)階。
代碼:
#include<iostream> #include<algorithm> using std::cin; using std::cout; using std::endl; #define ll long long const ll maxn = 200005; struct Edge { ll from, to, weight; } s[maxn << 2]; ll tot; struct Nodes { ll val, idx; } a[maxn]; ll fa[maxn]; ll n, m; ll find(ll x) { if(fa[x] == x) return x; return fa[x] = find(fa[x]); } bool cmp(Nodes A, Nodes B) { return A.val < B.val; } bool cmp1(Edge A, Edge B) { return A.weight < B.weight; } void add(ll u, ll v, ll w) { s[++tot] = (Edge){u, v, w}; } int main() { cin >> n >> m; for(ll i = 1; i <= n; i++) { cin >> a[i].val; a[i].idx = i; } while(m--) { ll u, v, w; cin >> u >> v >> w; add(u, v, w); } std::sort(a + 1, a + n + 1, cmp); for(ll i = 2; i <= n; i++) { add(a[i].idx, a[1].idx, a[1].val + a[i].val); } std::sort(s + 1, s + tot + 1, cmp1); for(ll i = 1; i <= n; i++) fa[i] = i; ll cost = 0; for(ll i = 1; i <= tot; i++) { ll u = find(s[i].from), v = find(s[i].to); if(u == v) continue; fa[v] = u; cost += s[i].weight; } cout << cost << endl; return 0; }
Codeforces Round #529 (Div. 3)錯過上分記