Submission #395157

#TimeUsernameProblemLanguageResultExecution timeMemory
395157ZenWoRDetecting Molecules (IOI16_molecules)C++14
100 / 100
105 ms14924 KiB
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
//#include "molecules.h"

#define ll long long
#define ar array<int>
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()

using namespace std;

//https://oj.uz/problem/view/IOI16_molecules

vector<vector<int>> ww;

vector<int> find_subset(int l, int u, vector<int> w) {
  int N=w.size();
  vector<int> ans;
  ll sumall=0;
  for(int i=0;i<N;i++) {
    sumall+=w[i];
    if(l<=w[i] and w[i]<=u) {
      ans.pb(i);
      return ans;
    }
    ww.push_back({w[i],i});
  }
  sort(ww.begin(),ww.end());
  if(l<=sumall and sumall<=u) {
    for(int i=0;i<N;i++)
      ans.pb(i);
    return ans;
  }

  if(sumall<l or ww[0][0]>l)
    return {};

  int L=0,R=0;
  ll sum=0;
  while(R<N) {
    while(R<N) {
      sum+=ww[R++][0];
      if(sum>=l)
        break;
    }
    if(sum>=l and sum<=u) {
      for(int i=L;i<R;i++)
        ans.pb(ww[i][1]);
      return ans;
    }
    while(L<R) {
      sum-=ww[L++][0];
      if(sum<=u)
        break;
    }
    if(sum>=l and sum<=u) {
      for(int i=L;i<R;i++)
        ans.pb(ww[i][1]);
      return ans;
    }
  }

  while(sum>u and L<N)
    sum-=ww[L++][1];
  if(sum>=l and sum<=u) {
    for(int i=L;i<R;i++)
      ans.pb(ww[i][1]);
    return ans;
  }
  return {};
}
#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...