Submission #89440

#TimeUsernameProblemLanguageResultExecution timeMemory
89440KLPPAliens (IOI16_aliens)C++14
60 / 100
2049 ms385344 KiB
#include "aliens.h" #include<algorithm> #include<iostream> #include<vector> #include<stdio.h> #include<queue> #include<deque> using namespace std; #define INF 1000000000000000000 typedef pair<long long int,long long int> pii; typedef long long int lld; vector<pair<long long int,long long int> >arr; //long long int DP[50001][4001]; int p; lld Cost[1000000]; lld sq(lld x){ return x*x; } lld sq2(lld x){ if(x>0)return x*x; return 0; } void print(pii a){ cout<<a.first<<" "<<a.second<<endl; } class CH{ deque<pii>d; public: double intersect(pii a,pii b){ return (double)(b.second-a.second)/(a.first-b.first); } void Print(){ queue<pii> q; while(!d.empty()){ print(d.front()); q.push(d.front()); d.pop_front(); } while(!q.empty()){ d.push_back(q.front()); q.pop(); } } void add(pii A){//print(A); //cout<<d.size()<<endl; if(d.size()<2){ d.push_back(A); return; } pii B,C; do{ B=d.back(); d.pop_back(); C=d.back(); }while(d.size()>1 && intersect(A,B)<=intersect(B,C)); if(intersect(A,B)>intersect(B,C)){ d.push_back(B); } d.push_back(A); } lld query(lld x){ if(d.size()==1)return d.front().first*x+d.front().second; pii A,B; do{ A=d.front(); d.pop_front(); B=d.front(); }while(d.size()>1 && intersect(A,B)<=x); if(intersect(A,B)>x)d.push_front(A); return d.front().first*x+d.front().second; } }; long long take_photos(int n, int m, int k, vector<int> r,vector<int> c) { pair<long long int,long long int>points[n]; for(int i=0;i<n;i++){ points[i]=pair<long long int,long long int>(r[i],c[i]); if(r[i]>c[i])swap(points[i].first,points[i].second); } for(int i=0;i<n;i++)points[i].second=-points[i].second; sort(points,points+n); for(int i=0;i<n;i++)points[i].second=-points[i].second; long long int cnts=-1; lld cntf=-1; for(int i=0;i<n;i++){ if(points[i].second>cnts && points[i].first>cntf){ cnts=points[i].second; cntf=points[i].first; arr.push_back(points[i]); //print(points[i]); } } p=arr.size(); for(int i=0;i<p;i++){ if(i==0)Cost[i]=0; else{ Cost[i]=sq2(-arr[i].first+arr[i-1].second+1); }//cout<<Cost[i]<<endl; } lld DP[p+1][k+1]; for(int photo=0;photo<=k;photo++){ for(int i=0;i<=p;i++){ DP[i][photo]=INF; } }DP[0][0]=0; for(int photo=1;photo<=k;photo++){ CH *C=new CH(); DP[0][photo]=0; for(int i=1;i<=p;i++){ if(DP[i-1][photo-1]<INF){ C->add(pii(-2*arr[i-1].first+2,sq(arr[i-1].first-1)-Cost[i-1]+DP[i-1][photo-1])); } DP[i][photo]=min(DP[i][photo],DP[i][photo-1]); /*for(int j=0;j<i;j++){ DP[i][photo]=min(DP[i][photo],DP[j][photo-1]-Cost[j]+sq(arr[i-1].second-arr[j].first+1)); }*/ DP[i][photo]=min(DP[i][photo],sq(arr[i-1].second)+C->query(arr[i-1].second)); //cout<<sq(arr[i-1].second)+C->query(arr[i-1].second)<<" "<<DP[i][photo]<<endl; //C->Print(); //cout<<endl; } } /*for(int photo=0;photo<=k;photo++){ for(int i=0;i<=p;i++){ cout<<DP[i][photo]<<" "; }cout<<endl; }*/ /*CH *D=new CH(); D->add(pii(2,1)); D->add(pii(-2,1)); D->add(pii(-3,2));D->Print(); D->add(pii(-4,3)); D->Print();*/ return DP[p][k]; }
#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...