提交记录 9744


用户 题目 状态 得分 用时 内存 语言 代码长度
Zy_Lx noip18f. 【NOIP2018】保卫王国 Wrong Answer 0 2 s 21996 KB C++ 2.64 KB
提交时间 评测时间
2019-07-11 11:14:39 2020-08-01 01:51:13
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f, N = 100010;

int n, m, xx, yy, aa, bb, lca;
LL val[N], f0[N], f1[N], nf0[N], nf1[N], vis[N], 
    fa[N], dep[N], g0[N], g1[N], path[N];
char type[5];
vector<int> e[N];
queue<int> q;

LL init_dfs(int u, int father){
    for(int i = 0; i < e[u].size(); i++){
        int v = e[u][i];
        if(v == father){ fa[u] = v; continue; }
        f1[u] += init_dfs(v, u);
        f0[u] += f1[v];
    }
    f1[u] += val[u];
    return min(f0[u], f1[u]);
}

void bfs(){
    dep[1] = 1;
    nf1[1] = val[1];
    q.push(1); vis[1] = 1;
    while(q.size()){
        int u = q.front(); q.pop();
        for(int i = 0; i < e[u].size(); i++){
            int v = e[u][i];
            if(vis[v]) continue;
            nf0[v] = nf1[u] + f1[u] - val[u] - min(f0[v], f1[v]);
            nf1[v] = min(nf1[u] + f1[u]- val[u] - min(f0[v], f1[v]), 
                     	 nf0[u] + f0[u] - f1[v]) + val[v];
            q.push(v); vis[v] = 1; dep[v] = dep[u] + 1;
        }
    }
    return;
}

/*int find_lca(int a, int b){
    int x = a, y = b;
    path[x] = 1, path[y] = 1;
    if(dep[x] < dep[y]) swap(x, y);
    while(dep[x] > dep[y]) x = fa[x], path[x] = 1;
    while(x != y) x = fa[x], y = fa[y], path[x] = 1, path[y] = 1;
    return x;
}*/

int dfs(int u){
    if(!path[u]){
        g0[u] = f0[u], g1[u] = f1[u];
        return min(g0[u], g1[u]);
    } 
    if(u == aa && u != lca){
        if(xx) return g1[u] = f1[u];
        else { g1[u] = INF; return g0[u] = f0[u]; }
    } 
    if(u == bb && u != lca){
        if(yy) return g1[u] = f1[u];
        else { g1[u] = INF; return g0[u] = f0[u]; }
    }
    for(int i = 0; i < e[u].size(); i++){
        int v = e[u][i];
        if(v == fa[u]) continue;
        g1[u] += dfs(v);
        g0[u] += g1[v];
    }
    g1[u] += val[u];
    return min(g0[u], g1[u]);
}

int main(){
    cin >> n >> m;
    cin >> type;
    for(int i = 1; i <= n; i++) cin >> val[i];
    for(int i = 1; i < n; i++){
        int x, y; cin >> x >> y;
        e[x].push_back(y), e[y].push_back(x);
    }
    init_dfs(1, 0);
    bfs();
    for(int i = 1; i <= m; i++){
    	memset(g0, 0, sizeof(g0));
    	memset(g1, 0, sizeof(g1));
    	memset(path, 0, sizeof(path));
        cin >> aa >> xx >> bb >> yy;
        //lca = find_lca(aa, bb);
        dfs(lca);
        if((lca == aa && !xx) || (lca == bb && !yy)) g1[lca] = INF;
        if((lca == aa && xx) || (lca == bb && yy)) g0[lca] = INF;
        int ans = min(nf0[lca] + g0[lca], nf1[lca] + g1[lca] - val[lca]);
        if(ans >= INF) cout << -1 << endl;
        else cout << ans << endl;
    }
    return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1990.54 us4 MB + 664 KBWrong AnswerScore: 0

Testcase #2999.66 us4 MB + 664 KBWrong AnswerScore: 0

Testcase #3993.53 us4 MB + 664 KBWrong AnswerScore: 0

Testcase #4991.78 us4 MB + 664 KBWrong AnswerScore: 0

Testcase #55.44 ms4 MB + 672 KBWrong AnswerScore: 0

Testcase #65.436 ms4 MB + 672 KBWrong AnswerScore: 0

Testcase #75.436 ms4 MB + 664 KBWrong AnswerScore: 0

Testcase #899.153 ms4 MB + 1000 KBWrong AnswerScore: 0

Testcase #999.166 ms4 MB + 1000 KBWrong AnswerScore: 0

Testcase #1099.101 ms4 MB + 912 KBWrong AnswerScore: 0

Testcase #1199.074 ms4 MB + 912 KBWrong AnswerScore: 0

Testcase #122 s21 MB + 492 KBTime Limit ExceededScore: 0

Testcase #132 s21 MB + 492 KBTime Limit ExceededScore: 0

Testcase #142 s21 MB + 492 KBTime Limit ExceededScore: 0

Testcase #152 s21 MB + 492 KBTime Limit ExceededScore: 0

Testcase #162 s21 MB + 492 KBTime Limit ExceededScore: 0

Testcase #172 s21 MB + 492 KBTime Limit ExceededScore: 0

Testcase #182 s14 MB + 64 KBTime Limit ExceededScore: 0

Testcase #192 s14 MB + 68 KBTime Limit ExceededScore: 0

Testcase #202 s17 MB + 304 KBTime Limit ExceededScore: 0

Testcase #212 s17 MB + 304 KBTime Limit ExceededScore: 0

Testcase #222 s17 MB + 304 KBTime Limit ExceededScore: 0

Testcase #232 s17 MB + 300 KBTime Limit ExceededScore: 0

Testcase #242 s17 MB + 304 KBTime Limit ExceededScore: 0

Testcase #252 s17 MB + 316 KBTime Limit ExceededScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-03 18:31:22 | Loaded in 2 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠