This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
vector<int32_t> find_subset(int32_t l, int32_t u, vector<int32_t> arr){
vector<pair<int, int32_t>> arr1;
for(int i = 0;i<arr.size();i++){
arr1.push_back(make_pair(arr[i], i));
}
sort(arr1.begin(), arr1.end());
vector<int32_t> answer;
int first = 0, last = 0;
int sum = 0;
while(last<=arr1.size() && first<arr.size()){
if(sum>=l && sum<=u){
for(int i = first;i<last;i++){
answer.push_back(arr1[i].second);
}
goto returnanswer;
}
else if(sum<l){
if(last<arr1.size()) sum+=arr1[last].first;
last++;
}
else{
sum-=arr1[first].first;
first++;
}
}
returnanswer:
return answer;
}
/*
#include<bits/stdc++.h>
#ifdef LOCAL_DEFINE
#include<conio.h>
#endif
using namespace std;
void io();
void end();
vector<int> find_subset(int l, int u, vector<int> v){
int n = v.size();
vector<pair<int, int>> p(n);
vector<int> ans(0), pref(n+1, 0);
for(int i = 0; i < n; i++){
p[i] = {v[i], i};
pref[i+1]=pref[i]+v[i];
if(v[i]>=l and v[i]<=u){ ans.push_back(i); return ans; }
}
int ll = -1, r = -1;
sort(p.begin(), p.end());
for(int i = 0, j = 1; i<n and j<=n;){
if(l<=(pref[j]-pref[i]) and (pref[j]-pref[i])<=u){ ll = i; r = j-1; break; }
if((pref[j]-pref[i])>u) i++;
else if((pref[j]-pref[i])<l) j++;
}
if(ll!=-1) for(int i = ll; i <= r; i++) ans.push_back(p[i].second);
return ans;
}
int main(){
io();
int l, u, n;
cin >> l >> u >> n;
vector<int> v(n);
for(int& i: v) cin >> i;
vector<int> z = find_subset(l, u, v);
for(auto i: z) cout << i << ' ';
end();
}
void io(){
#ifdef LOCAL_DEFINE
ios_base::sync_with_stdio(0); cin.tie(0);
freopen("input.txt", "rt", stdin);
#endif
}
void end(){
#ifdef LOCAL_DEFINE
cerr << "\nTime Elapsed: " << 1.0 * clock()/CLOCKS_PER_SEC << " s.\n";
getch();
#endif
}
*/
/*
if(ll==-1) for(int i = n-1, j = n; i>=0;){
if((pref[j]-pref[i])>=l and (pref[j]-pref[i])<=u){ ll = i; r = j-1; break; }
if((pref[j]-pref[i])>u){ j--; if(i==j) i--; }
else if((pref[j]-pref[i])<l) i--;
}
*/
Compilation message (stderr)
molecules.cpp: In function 'std::vector<int> find_subset(int32_t, int32_t, std::vector<int>)':
molecules.cpp:8:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0;i<arr.size();i++){
~^~~~~~~~~~~
molecules.cpp:15:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(last<=arr1.size() && first<arr.size()){
~~~~^~~~~~~~~~~~~
molecules.cpp:15:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(last<=arr1.size() && first<arr.size()){
~~~~~^~~~~~~~~~~
molecules.cpp:23:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(last<arr1.size()) sum+=arr1[last].first;
~~~~^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |