Submission #1017609

#TimeUsernameProblemLanguageResultExecution timeMemory
1017609simona1230Friend (IOI14_friend)C++17
27 / 100
20 ms7772 KiB
#include <bits/stdc++.h>
#include "friend.h"
using namespace std;

int c[100001];
int p[100001];
int t[100001];
int n;
vector<int> v[1024];
bool in[1024];

int brute;
void check()
{
    int sum=0;
    bool pos=1;
    for(int i=0;i<n;i++)
    {
        if(in[i])sum+=c[i];
        for(int j=0;j<v[i].size();j++)
        {
            int nb=v[i][j];
            if(in[i]&&in[nb])pos=0;
        }
    }
    if(!pos)return;

    brute=max(brute,sum);
}

int dp[100001][2];
void dfs(int i,int pr)
{
    for(int j=0;j<v[i].size();j++)
    {
        int nb=v[i][j];
        if(pr==nb)continue;
        dp[i][0]+=max(dp[nb][1],dp[nb][0]);
        dp[i][1]+=dp[nb][0];
    }
    dp[i][1]+=c[i];
}

void rec(int i)
{
    if(i==n)
    {
        check();
        return;
    }
    in[i]=1;
    rec(i+1);
    in[i]=0;
    rec(i+1);
}

int findSample(int N,int confidence[],int host[],int protocol[])
{
    n=N;
    int sum=0,maxx=0;
    for(int i=0;i<n;i++)
    {
        t[i]=protocol[i];
        //cout<<"- "<<t[i]<<endl;
        c[i]=confidence[i];
        p[i]=host[i];
        sum+=c[i];
        maxx=max(maxx,c[i]);

        if(i==0)continue;
        if(t[i]==2||t[i]==0)
        {
            v[i].push_back(p[i]);
            v[p[i]].push_back(i);
        }
        if(t[i]==2||t[i]==1)
        {
            for(int j=0;j<v[p[i]].size();j++)
            {
                int nb=v[p[i]][j];
                if(nb==i)continue;
                v[nb].push_back(i);
                v[i].push_back(nb);
            }
        }
    }

    /*for(int i=0;i<n;i++)
    {
        cout<<i<<": ";
        for(int j=0;j<v[i].size();j++)
        {
            cout<<v[i][j]<<" ";
        }
        cout<<endl;
    }*/

    if(n<=10)
    {
        rec(0);
        return brute;
    }
    //cout<<sum<<endl;
    bool o1=1;
    for(int i=1;i<n;i++)
        if(t[i]!=1)o1=0;
        //cout<<o1<<endl;
    if(o1==1)return sum;

    bool o2=1;
    for(int i=1;i<n;i++)
        if(t[i]!=2)o2=0;
	if(o2==1)return maxx;

	dfs(0,-1);
	return max(dp[0][1],dp[0][0]);
}

Compilation message (stderr)

friend.cpp: In function 'void check()':
friend.cpp:20:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |         for(int j=0;j<v[i].size();j++)
      |                     ~^~~~~~~~~~~~
friend.cpp: In function 'void dfs(int, int)':
friend.cpp:34:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |     for(int j=0;j<v[i].size();j++)
      |                 ~^~~~~~~~~~~~
friend.cpp: In function 'int findSample(int, int*, int*, int*)':
friend.cpp:78:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |             for(int j=0;j<v[p[i]].size();j++)
      |                         ~^~~~~~~~~~~~~~~
friend.cpp:111:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  111 |     for(int i=1;i<n;i++)
      |     ^~~
friend.cpp:113:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  113 |  if(o2==1)return maxx;
      |  ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...