답안 #966383

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
966383 2024-04-19T19:04:53 Z anton Spring cleaning (CEOI20_cleaning) C++17
9 / 100
1000 ms 11328 KB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int, int>
typedef complex<int> point;
const int MAX_N = 100000;

vector<vector<int>> adj;
vector<int> parity;
vector<int> anc;
vector<int> cost = {2, 1};
int total_cost= 0;

int count_leaves(int u, int a){
    int s= 0;
    for(auto v: adj[u]){
        if(v!=a){
            anc[v] = u;
            s+=count_leaves(v, u);
        }
    }
    if(s==0){
        s=1;
    }
    total_cost+= cost[s%2];
    
    //cout<<u+1<<" "<<s<<endl;
    parity[u] = s%2;
    return s%2;
}

void flip(int u){
    //cout<<"flip "<<u+1<<endl;
    total_cost -= cost[parity[u]];
    parity[u] ^= 1;
    total_cost+=cost[parity[u]];
    if(anc[u]!=-1){
        flip(anc[u]);
    }
}
signed main(){
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int n, k;
    cin>>n>>k;
    adj.resize(n);
    parity.resize(n);
    anc.resize(n, -1);
    int node = 0;
    int deg=  0;

    for(int i = 0; i<n-1; i++){
        int a, b;
        cin>>a>>b;
        a--;b--;
        adj[a].push_back(b);
        adj[b].push_back(a);
        if(adj[a].size()>deg){
            node =a;
            deg = adj[a].size();
        }
        if(adj[b].size()>deg){
            node =b;
            deg = adj[b].size();
        }
    }

    
    int r=count_leaves(node, -1);

    //cout<<"base "<<total_cost<<endl;
    for(int i = 0; i<k; i++){
        int d;
        cin>>d;
        vector<int> parents;
        for(int j = 0; j<d; j++){
            int v;
            cin>>v;
            v--;
            parents.push_back(v);
            adj[parents.back()].push_back(adj.size());
            total_cost++;
            if(adj[parents.back()].size()>2){
                flip(parents.back());
                r^=1;
            }
        }
        if(r%2==1){
            cout<<-1<<endl;
        }
        else{
            cout<<total_cost-2<<endl;
        }
        
        adj.resize(n);
        for(auto e: parents){
            if(adj[e].size()>2){
                flip(e);
                r^=1;
            }
            total_cost--;
            adj[e].pop_back();
        }
    }
}

Compilation message

cleaning.cpp: In function 'int main()':
cleaning.cpp:59:25: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   59 |         if(adj[a].size()>deg){
      |            ~~~~~~~~~~~~~^~~~
cleaning.cpp:63:25: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   63 |         if(adj[b].size()>deg){
      |            ~~~~~~~~~~~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 32 ms 2908 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 2772 KB Output is correct
2 Correct 9 ms 2772 KB Output is correct
3 Correct 19 ms 9160 KB Output is correct
4 Correct 26 ms 8536 KB Output is correct
5 Correct 34 ms 10956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 760 ms 3392 KB Output is correct
2 Correct 889 ms 3360 KB Output is correct
3 Correct 577 ms 10816 KB Output is correct
4 Execution timed out 1018 ms 11100 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1033 ms 3148 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 118 ms 6992 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 204 ms 11328 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 32 ms 2908 KB Output isn't correct
3 Halted 0 ms 0 KB -