Submission #582418

#TimeUsernameProblemLanguageResultExecution timeMemory
582418jasminFriend (IOI14_friend)C++14
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>
#include "friend.h"
using namespace std;

int subtask1(int n, int c[], int h[], int p[]){
    vector<set<int> > adi(n);
    for(int i=1; i<n; i++){
        if(p[i]==0){
            adi[h[i]].insert(i);
            adi[i].insert(h[i]);
        }
        else if(p[i]==1){
            for(auto u: adi[h[i]]){
                adi[u].insert(i);
                adi[i].insert(u);
            }
        }
        else{
            for(auto u: adi[h[i]]){
                adi[u].insert(i);
                adi[i].insert(u);
            }
            adi[h[i]].insert(i);
            adi[i].insert(h[i]);
        }
    }

    int ans=0;
    for(int i=0; i<(1<<n); i++){
        vector<int> active;
        int mom=0;
        for(int j=0; j<n; j++){
            if((i>>j)%2==1){
                mom+=c[j];
                active.push_back(j);
            }
        }

        for(auto v: active){
            for(auto u: active){
                if(adi[v].find(u)!=adi[v].end()) mom=0;
            }
        }
        ans=max(ans, mom);
    }
    return ans;
}

bool issubtask2(int n, int protocol[]){
    for(int i=1; i<n; i++){
        if(protocol[i]!=1) return false;
    }
    return true;
}
int subtask2(int n, int confidence[]){
    int ans=0;
    for(int i=0; i<n; i++){
        ans+=confidence[i];
    }
    return ans;
}

bool issubtask3(int n, int protocol[]){
    for(int i=1; i<n; i++){
        if(protocol[i]!=2) return false;
    }
    return true;
}
int subtask3(int n, int confidence[]){
    int ans=0;
    for(int i=0; i<n; i++){
        ans=max(ans, confidence[i]);
    }
    return ans;
}

bool issubtask4(int n, int protocol[]){
    for(int i=1; i<n; i++){
        if(protocol[i]!=0) return false;
    }
    return true;
}
void dfs(int v, vector<vector<int> >& adi, vector<vector<int> >& dp, int c[]){
    dp[v][0]=0;
    dp[v][1]=c[v];

    for(auto u: adi[v]){
        dfs(u, adi, dp, c);
        dp[v][0]+=max(dp[u][0], dp[u][1]);
        dp[v][1]+=dp[u][0];
    }
}
int subtask4(int n, int c[], int h[], int p[]){
    vector<vector<int> > adi(n);
    for(int i=1; i<n; i++){
        adi[h[i]].push_back(i);
    }

    vector<vector<int> > dp(n, vector<int> (2, -1));
    dfs(0, adi, dp, c);
    return max(dp[0][0], dp[0][1]);
}

bool improveMatching(int v, vector<vector<int> >& adi, vector<bool>& vis, vector<int>& m){
    if(vis[v]) return false;
    vis[v]=true;

    for(auto u: adi[v]){
        if(m[u]==-1 || improveMatching(m[u], adi, vis, m)){
            m[u]=v;
            return true;
        }
    }
    return false;
}

vector<int> matching(int n, vector<vector<int> >& adi, vector<bool>& left){
    vector<int> m(n, -1);
    vector<bool> vis(n);
    for(int i=0; i<n; i++){
        if(!left[i]) continue;
        int v=i;
        if(improveMatching(v, adi, vis, m)){
            vis.assign(n, false);
        }
    }
}

vector<bool> vertexcover(int n, vector<vector<int> >& adi, vector<bool>& left){
    vector<int> m=matching(n, adi, left);
    vector<bool> matched(n);
    for(int i=0; i<n; i++){
        matched[m[i]]=true;
        matched[i]=true;
    }

    vector<bool> vis(n);
    vector<bool> cover(n);
    for(int i=0; i<n; i++){
        if(left[i]&&!vis[i]){
            cover[i]=true;
        }
        if(!left[i]&&vis[i]){
            cover[i]=true;
        }
    }
    return cover;
}

int subtask5(int n, int c[], int h[], int p[]){
    vector<vector<int> > adi(n);
    vector<bool> left(n, false);
    left[0]=true;
    for(int i=1; i<n; i++){
        if(p[i]==0){
            adi[h[i]].push_back(i);
            adi[i].push_back(h[i]);
        }
        else{
            left[i]=true;
            for(auto u: adi[h[i]]){
                adi[u].push_back(i);
                adi[i].push_back(u);
            }
        }
    }

    vector<bool> c=vertexcover(n, adi, left);
    int ans=0;
    for(int i=0; i<n; i++){
        if(!c[i]){
            ans++;
        }
    }
    return ans;
}

int findSample(int n,int confidence[],int host[],int protocol[]){
    if(n<=10){
        return subtask1(n, confidence, host, protocol);
    }
    if(issubtask2(n, protocol)){
        return subtask2(n, confidence);
    }
    if(issubtask3(n, protocol)){
        return subtask3(n, confidence);
    }
    if(issubtask4(n, protocol)){
        return subtask4(n, confidence, host, protocol);
    }
    return subtask5(n, confidence, host, protocol);
}

/*signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);


    int n;
    cin >> n;
    int c[n];
    for(int i=0; i<n; i++){
        cin >> c[i];
    }
    int p[n];
    int h[n];
    for(int i=1; i<n; i++){
        cin >> p[i] >> h[i];
    }

    cout << subtask5(n, c, h, p) << "\n";
}*/

Compilation message (stderr)

friend.cpp: In function 'std::vector<int> matching(int, std::vector<std::vector<int> >&, std::vector<bool>&)':
friend.cpp:127:1: warning: no return statement in function returning non-void [-Wreturn-type]
  127 | }
      | ^
friend.cpp: In function 'int subtask5(int, int*, int*, int*)':
friend.cpp:168:18: error: declaration of 'std::vector<bool> c' shadows a parameter
  168 |     vector<bool> c=vertexcover(n, adi, left);
      |                  ^
friend.cpp:150:25: note: 'int* c' previously declared here
  150 | int subtask5(int n, int c[], int h[], int p[]){
      |                     ~~~~^~~