Submission #1176403

#TimeUsernameProblemLanguageResultExecution timeMemory
1176403AlgorithmWarriorAliens (IOI16_aliens)C++20
100 / 100
182 ms19648 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; long long const INF=1e18; struct interval{ int l,r; bool operator<(interval ot){ if(l!=ot.l) return l<ot.l; return r>ot.r; } }intv[100005]; long long diag[2000005]; void maxself(long long& x,long long val){ if(x<val) x=val; } void minself(long long& x,long long val){ if(x>val) x=val; } long long p2(int nr){ return 1LL*nr*nr; } struct line{ long long a,b; int cnt; }; long double inters(line l1,line l2){ return 1.0*(l2.b-l1.b)/(l1.a-l2.a); } struct answer{ long long val; int cnt; bool operator<(answer ot){ if(val!=ot.val) return val<ot.val; return cnt>ot.cnt; } }; answer eval(line lin,long long x){ return {lin.a*x+lin.b,lin.cnt}; } struct CHT{ deque<line>deq; void init(){ while(!deq.empty()) deq.pop_back(); } void add(line lin){ while(deq.size()>=2 && inters(lin,deq.back())<inters(deq[deq.size()-2],deq.back())) deq.pop_back(); deq.push_back(lin); } answer query(long long x){ answer ans={INF,0}; while(1){ answer cand=eval(deq[0],x); if(cand<ans) ans=cand; if(deq.size()>=2 && inters(deq[0],deq[1])<=1.0*x) deq.pop_front(); else break; } return ans; } }cht; answer get_dp(long long lambda,int total){ cht.init(); cht.add({-2*intv[1].l,p2(intv[1].l),0}); int i; answer ans; for(i=1;i<=total;++i){ ans=cht.query(intv[i].r); ans.val+=p2(intv[i].r)+lambda; ++ans.cnt; cht.add({-2*intv[i+1].l,p2(intv[i+1].l)-p2(max(0,intv[i].r-intv[i+1].l))+ans.val,ans.cnt}); } return ans; } long long take_photos(int n,int m,int k,vector<int>r,vector<int>c){ int i; for(i=0;i<2*m-1;++i) diag[i]=-1; for(i=0;i<n;++i){ int lin=r[i]; int col=c[i]; maxself(diag[lin+col],abs(lin-col)); } int total=0; for(i=0;i<2*m-1;++i) if(diag[i]>-1) intv[++total]={(i-(int)diag[i])/2,(i+(int)diag[i])/2+1}; sort(intv+1,intv+total+1); int new_total=0; intv[0]={-1,-1}; for(i=1;i<=total;++i) if(intv[new_total].r<intv[i].r) intv[++new_total]=intv[i]; total=new_total; /// [) long long st=0,dr=1e18; while(dr-st>1){ long long mij=(st+dr)/2; answer ans=get_dp(mij,total); if(ans.cnt>=k) st=mij; else dr=mij; } return get_dp(st,total).val-st*k; }

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...