답안 #342506

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
342506 2021-01-02T09:39:34 Z urd05 Spring cleaning (CEOI20_cleaning) C++14
18 / 100
1000 ms 24428 KB
#include <bits/stdc++.h>
using namespace std;
 
int deg[100000];
vector<int> adj[100000];
vector<int> son[100000];
int leaf[100000];
int p[100000];
int dp[100000];
const int nn=-1e9;
int ind[100000];
int f=0;
int sz[100000];
int rev[100000];
 
int getleaf(int v) {
    if (leaf[v]!=-1) {
        return leaf[v];
    }
    if (son[v].empty()) {
        return leaf[v]=1;
    }
    leaf[v]=0;
    for(int i=0;i<son[v].size();i++) {
        leaf[v]+=getleaf(son[v][i]);
    }
    return leaf[v];
}
 
int ans(int v) {
    if (dp[v]!=nn) {
        return dp[v];
    }
    if (p[v]==-1) {
        return 0;
    }
    int got=ans(p[v]);
    if (getleaf(v)%2==0)
        got--;
    else
        got++;
    return dp[v]=got;
}
 
void dfs(int v,int prev) {
    p[v]=prev;
    ind[v]=f++;
    sz[v]=1;
    for(int i=0;i<adj[v].size();i++) {
        int nt=adj[v][i];
        if (prev==nt) {
            continue;
        }
        son[v].push_back(nt);
        dfs(nt,v);
        sz[v]+=sz[nt];
    }
}
 
const int s=131072;
int seg[s*2];
 
int sum(int l,int r,int node=1,int nodel=0,int noder=s-1) {
    if (r<nodel||l>noder) {
        return 0;
    }
    if (l<=nodel&&noder<=r) {
        return seg[node];
    }
    int mid=(nodel+noder)/2;
    return sum(l,r,node*2,nodel,mid)+sum(l,r,node*2+1,mid+1,noder);
}
 
void update(int i,int val) {
    i+=s;
    seg[i]+=val;
    while (i>1) {
        i/=2;
        seg[i]=seg[i*2]+seg[i*2+1];
    }
}
 
bool comp(int a,int b) {
    return ind[a]<ind[b];
}
 
int main(void) {
    int n,q;
    scanf("%d %d",&n,&q);
    memset(leaf,-1,sizeof(leaf));
    for(int i=1;i<n;i++) {
        int u,v;
        scanf("%d %d",&u,&v);
        u--;
        v--;
        deg[u]++;
        deg[v]++;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    int r=0;
    for(int i=0;i<n;i++) {
        dp[i]=nn;
        p[i]=-1;
        if (deg[i]!=1) {
            r=i;
        }
    }
    dfs(r,-1);
    int ori=0;
    int l=0;
    for(int i=0;i<n;i++) {
        if (son[i].empty()) {
            l++;
            update(ind[i],1);
        }
        rev[ind[i]]=i;
    }
    for(int i=n-1;i>=0;i--) {
        if (son[rev[i]].empty()) {
            leaf[rev[i]]=1;
            continue;
        }
        leaf[rev[i]]=0;
        for(int j=0;j<son[rev[i]].size();j++) {
            leaf[rev[i]]+=leaf[son[rev[i]][j]];
        }
        if (i&&leaf[rev[i]]%2==0) {
            ori++;
        }
    }
    for(int i=0;i<q;i++) {
        int k;
        vector<int> cnt(n);
        for(int j=0;j<n;j++) {
            cnt[j]=0;
        }
        scanf("%d",&k);
        int ret=n-1+k;
        vector<int> save;
        for(int j=0;j<k;j++) {
            int v;
            scanf("%d",&v);
            v--;
            if (!son[v].empty()||cnt[v]>0) {
                update(ind[v],1);
                save.push_back(v);
                l++;
            }
            cnt[v]++;
        }
        if (l%2!=0) {
            printf("-1\n");
            for(int j=0;j<save.size();j++) {
                update(ind[save[j]],-1);
                l--;
            }
            continue;
        }
        for(int j=0;j<n;j++) {
            if (j!=r) {
                if (sum(ind[j],ind[j]+sz[j]-1)%2==0) {
                    ret++;
                }
            }
        }
        printf("%d\n",ret);
        for(int j=0;j<save.size();j++) {
            update(ind[save[j]],-1);
            l--;
        }
    }
}

Compilation message

cleaning.cpp: In function 'int getleaf(int)':
cleaning.cpp:24:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |     for(int i=0;i<son[v].size();i++) {
      |                 ~^~~~~~~~~~~~~~
cleaning.cpp: In function 'void dfs(int, int)':
cleaning.cpp:49:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |     for(int i=0;i<adj[v].size();i++) {
      |                 ~^~~~~~~~~~~~~~
cleaning.cpp: In function 'int main()':
cleaning.cpp:125:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |         for(int j=0;j<son[rev[i]].size();j++) {
      |                     ~^~~~~~~~~~~~~~~~~~~
cleaning.cpp:154:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  154 |             for(int j=0;j<save.size();j++) {
      |                         ~^~~~~~~~~~~~
cleaning.cpp:168:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  168 |         for(int j=0;j<save.size();j++) {
      |                     ~^~~~~~~~~~~~
cleaning.cpp:89:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   89 |     scanf("%d %d",&n,&q);
      |     ~~~~~^~~~~~~~~~~~~~~
cleaning.cpp:93:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   93 |         scanf("%d %d",&u,&v);
      |         ~~~~~^~~~~~~~~~~~~~~
cleaning.cpp:138:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  138 |         scanf("%d",&k);
      |         ~~~~~^~~~~~~~~
cleaning.cpp:143:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  143 |             scanf("%d",&v);
      |             ~~~~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5484 KB Output is correct
2 Execution timed out 1072 ms 7276 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 6376 KB Output is correct
2 Correct 24 ms 6300 KB Output is correct
3 Correct 70 ms 13032 KB Output is correct
4 Correct 67 ms 11108 KB Output is correct
5 Correct 95 ms 13160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 7016 KB Output is correct
2 Correct 26 ms 7036 KB Output is correct
3 Correct 98 ms 24428 KB Output is correct
4 Correct 112 ms 23392 KB Output is correct
5 Correct 82 ms 22636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1079 ms 7660 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1053 ms 11112 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1095 ms 13804 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5484 KB Output is correct
2 Execution timed out 1072 ms 7276 KB Time limit exceeded