Submission #89442

#TimeUsernameProblemLanguageResultExecution timeMemory
89442KLPPAliens (IOI16_aliens)C++14
100 / 100
310 ms42128 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;
typedef pair<pii,int> line;
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<line>d;
	public:
	double intersect(line a,line b){
		return (double)(b.first.second-a.first.second)/(a.first.first-b.first.first);
	}
	void Print(){
		/*queue<line> 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(line A){//print(A);
		//cout<<d.size()<<endl;
		if(d.size()<2){
			d.push_back(A);
			return;
		}
		line 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);
	}
	int query(lld x){
		if(d.size()==1)return d.front().second;
		line 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().second;
	}
};
lld Calc(lld M){
	lld DP[p];
	lld photo[p];
	DP[0]=0;
	photo[0]=0;
	CH *C=new CH();
	for(int i=1;i<=p;i++){//cout<<i<<endl;
		pii a=pii(-2*arr[i-1].first+2,sq(arr[i-1].first-1)-Cost[i-1]+DP[i-1]);
		line A=line(a,i-1);
		C->add(A);
		int j=C->query(arr[i-1].second);
		DP[i]=DP[j]-Cost[j]+sq(arr[i-1].second-arr[j].first+1)+M;
		photo[i]=photo[j]+1;
	}
	return DP[p]-photo[p]*M;
}
int Photos(lld M){
	lld DP[p];
	lld photo[p];
	DP[0]=0;
	photo[0]=0;
	CH *C=new CH();
	for(int i=1;i<=p;i++){//cout<<i<<endl;
		pii a=pii(-2*arr[i-1].first+2,sq(arr[i-1].first-1)-Cost[i-1]+DP[i-1]);
		line A=line(a,i-1);
		C->add(A);
		int j=C->query(arr[i-1].second);
		DP[i]=DP[j]-Cost[j]+sq(arr[i-1].second-arr[j].first+1)+M;
		photo[i]=photo[j]+1;
	}
	return photo[p];
}
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){
				pii a=pii(-2*arr[i-1].first+2,sq(arr[i-1].first-1)-Cost[i-1]+DP[i-1][photo-1]);
				line A=line(a,i-1);
				C->add(A);
			}
			DP[i][photo]=min(DP[i][photo],DP[i][photo-1]);
			int j=C->query(arr[i-1].second);
			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;
		}
	}*/
	lld lo=-1;
	lld hi=m+1;
	hi=hi*hi;
	lld DP[p+1];
	int photo[p+1];
	while(hi-lo>1){//cout<<hi<<" "<<lo<<endl;
		lld mid=(lo+hi)/2;
		if(Photos(mid)>k){
			lo=mid;
		}else hi=mid;
	}
	//cout<<lo<<" "<<hi<<endl;
	if(lo==-1){
		return Calc(0);
	}else{
		//cout<<Calc(lo)<<" "<<Calc(hi)<<endl;
		//cout<<Photos(lo)<<" "<<Photos(hi)<<endl;
		lld y1=Calc(lo);
		lld y2=Calc(hi);
		lld x1=Photos(lo);
		lld x2=Photos(hi);
		lld y=y1-y2;
		lld x=x1-x2;
		lld X=x1-k;
		lld ans=y1-(y*X)/x;
		return ans;
	}
	/*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 0;
}

Compilation message (stderr)

aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:161:6: warning: unused variable 'DP' [-Wunused-variable]
  lld DP[p+1];
      ^~
aliens.cpp:162:6: warning: unused variable 'photo' [-Wunused-variable]
  int photo[p+1];
      ^~~~~
#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...