Submission #52327

#TimeUsernameProblemLanguageResultExecution timeMemory
52327zetapiHoliday (IOI14_holiday)C++14
0 / 100
23 ms6232 KiB
#include <holiday.h> #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair //#define gr int //#define int long long #define itr ::iterator typedef pair<int,int> pii; const int MAX=2e5; struct data { int ind; int sum; } seg[MAX]; vector<pii> sorted; int N,D,Start,f[MAX],pos[MAX]; void build(int low,int high,int node) { if(low==high) { if(low<=sorted.size()) { seg[node].ind=1; seg[node].sum=sorted[low-1].first; } else { seg[node].ind=0; seg[node].sum=0; } return ; } int mid=(low+high)/2; build(low,mid,2*node); build(mid+1,high,2*node+1); seg[node].ind=seg[2*node].ind+seg[2*node+1].ind; seg[node].sum=seg[2*node].sum+seg[2*node+1].sum; return ; } int query(int low,int high,int node,int K) { if(low==high) return seg[node].sum; int mid=(low+high)/2; if(seg[2*node].ind>=K) return query(low,mid,2*node,K); return seg[2*node].sum+query(mid+1,high,2*node+1,K-seg[2*node].ind); } void update(int low,int high,int node,int idx,int delta) { if(low==high) { seg[node].ind=delta; if(delta) seg[node].sum=sorted[low-1].first; else seg[node].sum=0; return ; } int mid=(low+high)/2; if(idx>=low and idx<=mid) update(low,mid,2*node,idx,delta); else update(mid+1,high,2*node+1,idx,delta); seg[node].ind=seg[2*node].ind+seg[2*node+1].ind; seg[node].sum=seg[2*node].sum+seg[2*node+1].sum; return ; } int cal(int idx,int qlow,int qhigh) { int rem; pii res=mp(0,-qlow); for(int A=qhigh;A>=qlow;A--) { rem=idx-(A-Start); if(rem>0) res=max(res,mp(query(1,N,1,rem),-A)); update(1,N,1,pos[A],0); } for(int A=qlow;A<=qhigh;A++) update(1,N,1,pos[A],1); return -res.second; } void cal(int low,int high,int qlow,int qhigh) { if(low>high) return ; int mid=(low+high)/2; f[mid]=cal(mid,qlow,qhigh); if(low==high) { for(int A=qlow+1;A<qhigh;A++) update(1,N,1,pos[A],0); return ; } cal(mid+1,high,f[mid],qhigh); cal(low,mid-1,qlow,f[mid]); return ; } long long int findMaxAttraction(int n,int start,int d,int attraction[]) { N=n; D=d; Start=start+1; int cur,res=0; for(int A=start;A<N;A++) sorted.pb(mp(attraction[A],A+1)); sort(sorted.begin(),sorted.end()); reverse(sorted.begin(),sorted.end()); for(int A=0;A<sorted.size();A++) pos[sorted[A].second]=A+1; build(1,N,1); cal(1,D,Start,min(Start+D,N)); /*for(int A=1;A<=N;A++) cout<<f[A]<<" "; cout<<cal(3,3,5)<<"\n";*/ cur=D-(f[D]-1); priority_queue<int> pq; for(int A=0;A<f[D];A++) pq.push(attraction[A]); while(!pq.empty() and (cur)) { res+=pq.top(); pq.pop(); cur--; } return res; } /*int main() { ios_base::sync_with_stdio(false); cout<<findMaxAttraction()<<"\n"; return 0; }*/

Compilation message (stderr)

holiday.cpp: In function 'void build(int, int, int)':
holiday.cpp:29:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(low<=sorted.size())
      ~~~^~~~~~~~~~~~~~~
holiday.cpp: In function 'long long int findMaxAttraction(int, int, int, int*)':
holiday.cpp:123:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int A=0;A<sorted.size();A++)
              ~^~~~~~~~~~~~~~
grader.cpp: In function 'int main()':
grader.cpp:7:12: warning: variable 'n_s' set but not used [-Wunused-but-set-variable]
     int i, n_s;
            ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...