1. 程式人生 > >Codeforces Round #529 (Div. 3)錯過上分記

Codeforces Round #529 (Div. 3)錯過上分記

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)錯過上分記