NOIP2018D2T3 保卫王国(待更新)

提交地址:洛谷P5024

44分部分分又没拿全

考场24分代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 100006;
int n, m;
char ch[6];
ll p[N], f[N][2];
vector<int> e[N];

void chA() {
    while (m--) {
        int a, x, b, y;
        scanf("%d %d %d %d", &a, &x, &b, &y);
        memset(f, 0x3f, sizeof(f));
        f[a][x^1] = f[b][y^1] = -1;
        f[0][0] = f[0][1] = 0;
        for (int i = 1; i <= n; i++) {
            if (f[i][0] != -1) f[i][0] = f[i-1][1];
            if (f[i][1] != -1) {
                if (f[i-1][0] == -1 && f[i-1][1] == -1) f[i][1] = -1;
                else if (f[i-1][0] == -1) f[i][1] = f[i-1][1] + p[i];
                else if (f[i-1][1] == -1) f[i][1] = f[i-1][0] + p[i];
                else f[i][1] = min(f[i-1][0], f[i-1][1]) + p[i];
            }
        }
        if (f[n][0] == -1 && f[n][1] == -1) {
            cout << "-1" << endl;
            continue;
        }
        if (f[n][0] == -1) {
            cout << f[n][1] << endl;
            continue;
        }
        if (f[n][1] == -1) {
            cout << f[n][0] << endl;
            continue;
        }
        cout << min(f[n][0], f[n][1]) << endl;
    }
}

int main() {
    //freopen("defense.in", "r", stdin);
    //freopen("defense.out", "w", stdout);
    scanf("%d %d %s", &n, &m, ch);
    for (int i = 1; i <= n; i++) scanf("%lld", &p[i]);
    for (int i = 1; i < n; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    if (ch[0] == 'A') {
        chA();
        return 0;
    }
    return 0;
}

题解待更新

猜你喜欢

转载自www.cnblogs.com/xht37/p/10182260.html