Submission #651362

#TimeUsernameProblemLanguageResultExecution timeMemory
651362pauloamedDetecting Molecules (IOI16_molecules)C++14
100 / 100
62 ms6772 KiB
#include<bits/stdc++.h>
#include "molecules.h"
using namespace std;

#define ll long long

vector<int> find_subset(int l, int u, vector<int> w){
  int n = w.size();

  vector<pair<int,int>> W;
  for(int i = 0; i < n; ++i){
    W.push_back({w[i], i});
  }
  sort(W.begin(), W.end());

  ll pref[n], suf[n];
  for(int i = 0; i < n; ++i){
    pref[i] = W[i].first;
    if(i) pref[i] += pref[i - 1];
  }

  for(int i = n - 1; i >= 0; --i){
    suf[i] = W[i].first;
    if(i < n - 1) suf[i] += suf[i + 1];
  }

  int k = -1;
  for(int i = 1; i <= n; ++i){
    int p = i - 1;
    int s = n - i;

    if(pref[p] <= u && suf[s] >= l){
      k = i;
      break;
    }
  }

  if(k == -1) return {};
  
  int sum = pref[k - 1];
  for(int i = k - 1; i < n; ++i){
    int plast = (i - k < 0)? 0 : pref[i - k];
    sum = pref[i] - plast;
    if(sum >= l && sum <= u){
      vector<int> ans;
      for(int j = i - k + 1; j <= i; ++j){
        ans.push_back(W[j].second);
      }
      sort(ans.begin(), ans.end());
      return ans;
    }
  }
  return {};
}

// int32_t main(){
//   auto ret = find_subset(15, 17, {6,8,8,7});
//   for(auto x : ret) cout << x << " ";
//   cout << "\n";

//   ret = find_subset(14, 15, {5, 5, 6, 6});
//   for(auto x : ret) cout << x << " ";
//   cout << "\n";

//   ret = find_subset(10, 20, {15, 17, 16, 18});
//   for(auto x : ret) cout << x << " ";
//   cout << "\n";
// }
#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...