Submission #105361

# Submission time Handle Problem Language Result Execution time Memory
105361 2019-04-11T14:18:52 Z TuGSGeReL Friend (IOI14_friend) C++14
46 / 100
1000 ms 17408 KB
#include "friend.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

#define ll long long
#define mp make_pair
#define pub push_back
#define pob pop_back()
#define ss second
#define ff first
#define mt make_tuple
#define pof pop_front()
#define fbo find_by_order
#define ook order_of_key

typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
using pll = pair <ll, ll>;
using pii = pair <int, int>;

int used[2001], pre[3], dp[2001][2], idx, par[2001], fl[2001][2001];
vector <int> edg[2001];
pair<int, int> p[1001];

int solve1(int n, int confidence[], int host[], int protocol[])
{

  int ans = 0;

  for (int i = 1; i < n; i++)
  {
    if ( !protocol[i] )
    {
      edg[i].pub(host[i]);
      edg[host[i]].pub(i);
    } else if ( protocol[i] == 1 )
    {
      for (int j = 0; j < edg[host[i]].size(); j++)
      {
        edg[edg[host[i]][j]].pub(i);
        edg[i].pub(edg[host[i]][j]);
      }
    } else {
      for (int j = 0; j < edg[host[i]].size(); j++)
      {
        edg[i].pub(edg[host[i]][j]);
        edg[edg[host[i]][j]].pub(i);
      }

      edg[i].pub(host[i]);
      edg[host[i]].pub(i);
    }
  }

  for (int i = 0; i < (1 << n); i++)
  {
    memset(used, 0, sizeof used);
    bool boo = 0;
    int res = 0;

    for (int j = 0; j < n; j++)
    {
      if ( i & (1 << j) )
      {
        for ( auto x : edg[j] )
          if ( used[x] )
            boo = 1;

        res += confidence[j];
        used[j] = 1;
      }
    }

    if ( !boo )
      ans = max(ans, res);
  }

  return ans;
}

void dfs(int u, int par)
{
  bool boo = 1;
  for (auto x : edg[u])
    if ( x != par )
      dfs(x, u), boo = 0;

  if ( par != -1 )
  {
    dp[par][0] += max(dp[u][1], dp[u][0]);
    dp[par][1] += dp[u][0];
  }
}

bool bfs(int u)
{
  memset(used, 0, sizeof used);
  used[u] = 1;
  par[u] = -1;
  queue<int>q;
  q.push(u);

  while (!q.empty())
  {
    u = q.front();
    q.pop();

    for (int i = 0; i <= idx + 1; i++)
    {
      if ( fl[u][i] && !used[i] )
      {
        used[i] = 1;
        par[i] = u;
        q.push(i);
      }
    }
  }

  if ( used[idx + 1] )
    return 1;

  return 0;
}

int findSample(int n,int confidence[],int host[],int protocol[]){

  if ( n <= 10 )
    return solve1(n, confidence, host, protocol);

  for (int i = 1; i < n; i++)
    pre[protocol[i]]++;

  if ( pre[1] == n - 1 )
  {
    int ans = 0;

    for (int i = 0; i < n; i++)
      ans += confidence[i];

    return ans;
  }

  if ( pre[2] == n - 1 )
  {
    int ans = 0;

    for (int i = 0; i < n; i++)
      ans = max(ans, confidence[i]);

    return ans;
  }

  if ( pre[0] == n - 1 )
  {
    for (int i = 1; i < n; i++)
    {
      edg[host[i]].pub(i);
      edg[i].pub(host[i]);
    }

    for (int i = 0; i < n; i++)
      dp[i][1] = confidence[i];

    dfs(0, -1);

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

  for (int i = 0; i < n; i++)
  {
    p[i].ff = ++idx;
    fl[0][idx] = 1;
    p[i].ss = ++idx;
    fl[p[i].ff][p[i].ss] = fl[p[i].ss][p[i].ff] = 1;
  }	
  for (int i = 1; i < n; i++)
  {
    if ( !protocol[i] )
    {
      edg[i].pub(host[i]);
      edg[host[i]].pub(i);
      fl[p[host[i]].ss][p[i].ff] = fl[p[i].ff][p[host[i]].ss] = 1;
    } else {
      for (auto x : edg[host[i]])
      {
        fl[p[x].ss][p[i].ff] = fl[p[i].ff][p[x].ss] = 1;
        edg[x].pub(i);
        edg[i].pub(x);
      }
    }
  }
  for (int i = 0; i <= idx; i++)
    fl[p[i].ss][idx + 1] = fl[idx + 1][p[i].ss] = 1;
  int ans = 0;

  while (bfs(0))
  {
    for (int i = idx + 1; par[i] != -1; i = par[i])
      fl[par[i]][i]--, fl[i][par[i]]++;
    ans++;
  }

  return ans;
}

Compilation message

friend.cpp: In function 'int solve1(int, int*, int*, int*)':
friend.cpp:40:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for (int j = 0; j < edg[host[i]].size(); j++)
                       ~~^~~~~~~~~~~~~~~~~~~~~
friend.cpp:46:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for (int j = 0; j < edg[host[i]].size(); j++)
                       ~~^~~~~~~~~~~~~~~~~~~~~
friend.cpp: In function 'void dfs(int, int)':
friend.cpp:85:8: warning: variable 'boo' set but not used [-Wunused-but-set-variable]
   bool boo = 1;
        ^~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 512 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 3 ms 384 KB Output is correct
5 Correct 3 ms 256 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 2 ms 384 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 3 ms 384 KB Output is correct
10 Correct 4 ms 512 KB Output is correct
11 Correct 3 ms 384 KB Output is correct
12 Correct 3 ms 384 KB Output is correct
13 Correct 0 ms 384 KB Output is correct
14 Correct 3 ms 384 KB Output is correct
15 Correct 3 ms 384 KB Output is correct
16 Correct 3 ms 512 KB Output is correct
17 Correct 3 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 3 ms 384 KB Output is correct
5 Correct 3 ms 384 KB Output is correct
6 Correct 3 ms 384 KB Output is correct
7 Correct 2 ms 384 KB Output is correct
8 Correct 3 ms 384 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 3 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 3 ms 384 KB Output is correct
5 Correct 3 ms 384 KB Output is correct
6 Correct 3 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 3 ms 384 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 2 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 512 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 3 ms 460 KB Output is correct
6 Correct 3 ms 384 KB Output is correct
7 Correct 2 ms 384 KB Output is correct
8 Correct 2 ms 512 KB Output is correct
9 Correct 3 ms 384 KB Output is correct
10 Correct 2 ms 384 KB Output is correct
11 Correct 3 ms 512 KB Output is correct
12 Correct 3 ms 384 KB Output is correct
13 Correct 3 ms 512 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 3 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 3 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 2 ms 384 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 3 ms 512 KB Output is correct
10 Correct 2 ms 384 KB Output is correct
11 Execution timed out 1024 ms 5856 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 384 KB Output is correct
2 Correct 3 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 3 ms 384 KB Output is correct
11 Correct 2 ms 384 KB Output is correct
12 Runtime error 69 ms 17408 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Halted 0 ms 0 KB -