Submission #120976

#TimeUsernameProblemLanguageResultExecution timeMemory
120976knon0501Aliens (IOI16_aliens)C++17
60 / 100
2057 ms12024 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; #define f first #define s second typedef pair<long long,long long> pp; pp a[500005]; long long dp[500005]; pair<pp,int> ss[2][500005]; int nn; pp aa[500005]; long long cc[500005]; inline long double cr(pp x,pp y){ if(x.f==y.f)return 0; return (long double)(y.s-x.s)/(long double)(x.f-y.f); } long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) { long long ans; int i,j; for(i=1 ; i<=n ; i++){ a[i]={r[i-1],c[i-1]}; if(a[i].s<a[i].f)swap(a[i].f,a[i].s); } sort(a+1,a+n+1); j=0; a[0].f=-1; a[0].s=-1; a[n+1].f=-1; for(i=1 ; i<=n ; i++){ if(a[i].s<=a[j].s || a[i].f==a[i+1].f); else{ aa[++nn]=a[i]; j=i; } } n=nn; /// cout<<n<<endl; int t=0; for(i=1 ; i<=n ; i++){ dp[i]=(aa[i].s-aa[1].f+1)*(aa[i].s-aa[1].f+1); cc[i]=aa[i].f*aa[i].f-max((long long)0,aa[i-1].s-aa[i].f+1)*max((long long)0,aa[i-1].s-aa[i].f+1); cc[1]=aa[1].f*aa[1].f; while(t>=2 && cr(ss[1][t].f,ss[1][t-1].f)>=cr(ss[1][t-1].f,{-aa[i].f,dp[i-1]+cc[i]}))t--; if(t==1 && ss[1][t].f.s>=dp[i-1]+cc[i])t--; ss[1][++t]={{-aa[i].f,dp[i-1]+cc[i]},i}; /// cout<<t<<"!@"<<endl; } ///cout<<cr(s[1][2].f,s[1][1].f)<<endl; int tt; ans=dp[n]; for(int l=2 ; l<=k ; l++){ j=1; tt=0; for(i=l ; i<=n ; i++){ while(ss[1][j+1].s<=i && j<t && cr(ss[1][j].f,ss[1][j+1].f)<2*(aa[i].s+1))j++; dp[i]=(aa[i].s+1)*(aa[i].s+1)+ss[1][j].f.s+2*ss[1][j].f.f*(aa[i].s+1); pair<pp,int> w={{-aa[i].f,cc[i]+dp[i-1]},i}; while(tt>=2 && cr(ss[0][tt].f,ss[0][tt-1].f)>=cr(ss[0][tt-1].f,w.f))tt--; if(tt==1 && ss[0][tt].f.s>=w.f.s)tt--; ss[0][++tt]=w; } for(i=1 ; i<=tt ; i++)ss[1][i]=ss[0][i]; if(l<=n) ans=min(dp[n],ans); t=tt; } return ans; }
#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...