Submission #262214

# Submission time Handle Problem Language Result Execution time Memory
262214 2020-08-12T13:31:48 Z stoyan_malinin Detecting Molecules (IOI16_molecules) C++14
9 / 100
2 ms 2304 KB
#include "molecules.h"
//#include "grader.cpp"

#include <bitset>
#include <time.h>
#include <random>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 5e5 + 5;
mt19937 rnd(22);

int dp[MAXN];

void filterVector(vector <int> &v, int lim)
{
    vector <int> newVal;
    for(int x: v)
    {
        if(x<=lim) newVal.push_back(x);
    }

    v = newVal;
}

vector <int> recoverAnswer(int x, vector <int> &w)
{
    vector <int> answer;

    while(x!=0)
    {
        answer.push_back(dp[x]);
        x = x - w[ dp[x] ];
    }

    return answer;
}

vector <int> solveSingle(int l, int u, vector <int> &w)
{
    for(int i = 0;i<w.size();i++)
    {
        if(w[i]>=l && w[i]<=u) return vector <int> {i};
    }

    return vector <int> {};
}

vector <int> solveDouble(int l, int u, vector <int> w)
{
    sort(w.begin(), w.end());
    for(int i = 0;i<w.size()-1;i++)
    {
        if(w[i]+w[i+1]>u) break;
        if(w[i]+w.back()<l) continue;

        int low = i + 1, high = w.size() - 1, mid;
        while(low+1<high)
        {
            mid = (low+high)/2;

            if(w[i]+w[mid]>=l) high = mid;
            else low = mid + 1;
        }

        if(low<w.size() && w[i]+w[low]>=l && w[i]+w[low]<=u) return vector <int> {i, low};
        if(high<w.size() && w[i]+w[high]>=l && w[i]+w[high]<=u) return vector <int> {i, high};
    }

    return vector <int> {};
}

vector <int> specialCaseSolutions(int l, int u, vector <int> &w)
{
    vector <int> answer = {};

    answer = solveSingle(l, u, w);
    if(answer.empty()==false) return answer;

    answer = solveDouble(l, u, w);
    if(answer.empty()==false) return answer;

    return vector <int> {};
}

vector<int> find_subset(int l, int u, vector <int> w)
{
    shuffle(w.begin(), w.end(), rnd);

    double start = clock();
    memset(dp, -1, sizeof(dp));

    filterVector(w, u);
    if(w.empty()==true) return vector <int> {};

    vector <int> specialCase = specialCaseSolutions(l, u, w);
    if(specialCase.empty()==false) return specialCase;

    dp[0] = -2;
    for(int i = 0;i<w.size();i++)
    {
        if(double(clock()-start)/CLOCKS_PER_SEC>0.85)
        {
            return vector <int> {};
        }

        for(int j = u-w[i];j>=max(l-w[i], 0);j--)
        {
            if(dp[j]!=-1 && dp[ j + w[i] ]==-1)
            {
                dp[ j + w[i] ] = i;
                return recoverAnswer(j+w[i], w);
            }
        }
        for(int j = l-w[i]-1;j>=0;j--)
        {
            if(dp[j]!=-1 && dp[ j + w[i] ]==-1) dp[ j + w[i] ] = i;
        }
    }

    return vector <int> {};
}

Compilation message

molecules.cpp: In function 'std::vector<int> solveSingle(int, int, std::vector<int>&)':
molecules.cpp:43:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |     for(int i = 0;i<w.size();i++)
      |                   ~^~~~~~~~~
molecules.cpp: In function 'std::vector<int> solveDouble(int, int, std::vector<int>)':
molecules.cpp:54:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |     for(int i = 0;i<w.size()-1;i++)
      |                   ~^~~~~~~~~~~
molecules.cpp:68:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         if(low<w.size() && w[i]+w[low]>=l && w[i]+w[low]<=u) return vector <int> {i, low};
      |            ~~~^~~~~~~~~
molecules.cpp:69:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |         if(high<w.size() && w[i]+w[high]>=l && w[i]+w[high]<=u) return vector <int> {i, high};
      |            ~~~~^~~~~~~~~
molecules.cpp: In function 'std::vector<int> find_subset(int, int, std::vector<int>)':
molecules.cpp:102:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |     for(int i = 0;i<w.size();i++)
      |                   ~^~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
2 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
3 Correct 2 ms 2304 KB OK (n = 1, answer = YES)
4 Correct 1 ms 2304 KB OK (n = 2, answer = YES)
5 Correct 2 ms 2304 KB OK (n = 2, answer = YES)
6 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
7 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
8 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
9 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
10 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
11 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
12 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
13 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
14 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
15 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
16 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
17 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
18 Correct 2 ms 2304 KB OK (n = 100, answer = NO)
19 Correct 2 ms 2304 KB OK (n = 100, answer = YES)
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 2304 KB sum of weights should be in [302..304] but it is 300
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
2 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
3 Correct 2 ms 2304 KB OK (n = 1, answer = YES)
4 Correct 1 ms 2304 KB OK (n = 2, answer = YES)
5 Correct 2 ms 2304 KB OK (n = 2, answer = YES)
6 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
7 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
8 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
9 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
10 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
11 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
12 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
13 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
14 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
15 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
16 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
17 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
18 Correct 2 ms 2304 KB OK (n = 100, answer = NO)
19 Correct 2 ms 2304 KB OK (n = 100, answer = YES)
20 Incorrect 1 ms 2304 KB sum of weights should be in [302..304] but it is 300
21 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
2 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
3 Correct 2 ms 2304 KB OK (n = 1, answer = YES)
4 Correct 1 ms 2304 KB OK (n = 2, answer = YES)
5 Correct 2 ms 2304 KB OK (n = 2, answer = YES)
6 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
7 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
8 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
9 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
10 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
11 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
12 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
13 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
14 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
15 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
16 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
17 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
18 Correct 2 ms 2304 KB OK (n = 100, answer = NO)
19 Correct 2 ms 2304 KB OK (n = 100, answer = YES)
20 Incorrect 1 ms 2304 KB sum of weights should be in [302..304] but it is 300
21 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
2 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
3 Correct 2 ms 2304 KB OK (n = 1, answer = YES)
4 Correct 1 ms 2304 KB OK (n = 2, answer = YES)
5 Correct 2 ms 2304 KB OK (n = 2, answer = YES)
6 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
7 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
8 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
9 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
10 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
11 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
12 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
13 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
14 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
15 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
16 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
17 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
18 Correct 2 ms 2304 KB OK (n = 100, answer = NO)
19 Correct 2 ms 2304 KB OK (n = 100, answer = YES)
20 Incorrect 1 ms 2304 KB sum of weights should be in [302..304] but it is 300
21 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
2 Correct 1 ms 2304 KB OK (n = 1, answer = NO)
3 Correct 2 ms 2304 KB OK (n = 1, answer = YES)
4 Correct 1 ms 2304 KB OK (n = 2, answer = YES)
5 Correct 2 ms 2304 KB OK (n = 2, answer = YES)
6 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
7 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
8 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
9 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
10 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
11 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
12 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
13 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
14 Correct 2 ms 2304 KB OK (n = 3, answer = YES)
15 Correct 1 ms 2304 KB OK (n = 3, answer = YES)
16 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
17 Correct 1 ms 2304 KB OK (n = 3, answer = NO)
18 Correct 2 ms 2304 KB OK (n = 100, answer = NO)
19 Correct 2 ms 2304 KB OK (n = 100, answer = YES)
20 Incorrect 1 ms 2304 KB sum of weights should be in [302..304] but it is 300
21 Halted 0 ms 0 KB -