Submission #24874

#TimeUsernameProblemLanguageResultExecution timeMemory
24874evenharder역사적 조사 (JOI14_historical)C++11
40 / 100
4000 ms15560 KiB
#include <cstdio> #include <set> #include <map> #include <vector> #include <algorithm> #include <utility> #include <cmath> #include <functional> struct query{ int l,r,n; long long int ans; query(int l=0, int r=0, int n=0) : l(l), r(r), n(n) {ans=0LL;} }; std::map<int, long long int> m; // amount std::multiset<long long int, std::greater<long long int> > s; std::vector<query> vq; const int MAX_N=100000; int x[MAX_N+1]; int n,q; void calc() { int sq=(int)(ceil(sqrt(n+1))); std::sort(vq.begin(), vq.end(), [&] (query A, query B) { return A.l/sq == B.l/sq ? A.r < B.r : A.l < B.l; }); int l=1; int r=0; for(int i=0;i<n;i++) s.insert(0); for(int i=0;i<q;i++) { while(r<vq[i].r) { r++; long long int prev = m[x[r]] * x[r]; auto it = s.find(prev); s.erase(it); m[x[r]]++; s.insert(prev+x[r]); } while(r>vq[i].r) { long long int prev = m[x[r]] * x[r]; auto it = s.find(prev); s.erase(it); m[x[r]]--; s.insert(prev-x[r]); r--; } while(l<vq[i].l) { long long int prev = m[x[l]] * x[l]; auto it = s.find(prev); s.erase(it); m[x[l]]--; s.insert(prev-x[l]); l++; } while(l>vq[i].l) { l--; long long int prev = m[x[l]] * x[l]; auto it = s.find(prev); s.erase(it); m[x[l]]++; s.insert(prev+x[l]); } vq[i].ans=*s.begin(); } std::sort(vq.begin(), vq.end(), [&] (query A, query B) { return A.n < B.n; }); for(int i=0;i<q;i++) printf("%lld\n", vq[i].ans); } int main() { scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) { scanf("%d",&x[i]); } for(int i=0;i<q;i++) { static int l,r; scanf("%d%d",&l,&r); vq.push_back(query(l,r,i)); } calc(); }

Compilation message (stderr)

historic.cpp: In function 'int main()':
historic.cpp:83:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&n,&q);
                        ^
historic.cpp:86:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&x[i]);
                          ^
historic.cpp:91:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&l,&r);
                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...