Submission #364776

#TimeUsernameProblemLanguageResultExecution timeMemory
364776nandonathanielAliens (IOI16_aliens)C++14
100 / 100
291 ms12564 KiB
#include "aliens.h"
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long LL;
typedef pair<LL,LL> pii;
typedef pair<pii,LL> piii;
vector<pii> V,point;
vector<piii> line;
LL N,M,K,dp[100005],opt[100005];
 
bool cmpV(pii A,pii B){
	if(A.fi!=B.fi)return A.fi<B.fi;
	return A.se>B.se;
}
 
pii tpot(pii satu,pii dua){
	pii jwb;
	jwb.fi=dua.se-satu.se;
	jwb.se=satu.fi-dua.fi;
	return jwb;
}
 
bool cmp(pii a,pii b){
	return a.fi*b.se<=a.se*b.fi;
}
 
LL sq(LL a){
	return a*a;
}
 
LL F(LL penalty){
	line.clear();
	for(LL i=1;i<=N;i++){
		LL x=V[i].se;
		LL intersect;
		if(V[i].first>V[i-1].second)intersect=0;
		else intersect=sq(V[i-1].second-V[i].first+1);
		piii now={{2*V[i].fi,-(V[i].fi*V[i].fi-2*V[i].fi+1-intersect+dp[i-1])},i-1};
		LL skg=line.size()-1,prev=line.size()-2;
		while(skg>0 && cmp(tpot(now.fi,line[skg].fi),tpot(now.fi,line[prev].fi))){
			//hapus yang gamasuk hull
			line.pop_back();
			skg--;
			prev--;
		}
		line.push_back(now);
		LL ki=1,ka=(LL)line.size()-1,add=-1e18,id;
		while(ki<=ka){
			LL mid=(ki+ka)/2;
			LL l=line[mid-1].fi.fi*x+line[mid-1].fi.se;
			LL r=line[mid].fi.fi*x+line[mid].fi.se;
			if(l>add){
				add=l;
				id=line[mid-1].se;
			}
			if(r>add){
				add=r;
				id=line[mid].se;
			}
			if(l>r)ka=mid-1;
			else ki=mid+1;
		}
		if(line.size()==1){
			add=line[0].fi.fi*x+line[0].fi.se;
			id=line[0].se;
		}
		dp[i]=-add+sq(V[i].se)+2*V[i].se+penalty;
		opt[i]=id;
	}
	LL noww=N,byk=0;
	while(noww!=0){
		byk++;
		noww=opt[noww];
	}
	return byk;
}
 
LL take_photos(int n, int m, int k, vector<int> r, vector<int> c) {
	N=(LL)n;M=(LL)m;K=(LL)k;
	for(LL i=0;i<N;i++){
		if(r[i]>c[i])swap(r[i],c[i]);
		point.push_back(make_pair((LL)r[i],(LL)c[i]));
	}
	sort(point.begin(),point.end(),cmpV);
	point.erase(unique(point.begin(),point.end()),point.end());
	V.push_back(make_pair(-1,-1));
	V.push_back(point[0]);
	pii last=point[0];
	for(LL i=1;i<N;i++){
		if(point[i].se>last.se){
			V.push_back(point[i]);
			last=point[i];
		}
	}
	N=V.size()-1;
	K=min(K,N);
	LL ki=0,ka=M*M,res;
	while(ki<=ka){
		LL mid=(ki+ka)/2;
		if(F(mid)>K)ki=mid+1;
		else{
			res=mid;
			ka=mid-1;
		}
	}
	F(res);
	res=dp[N]-res*k;
	return res;
}

Compilation message (stderr)

aliens.cpp: In function 'LL F(LL)':
aliens.cpp:70:9: warning: 'id' may be used uninitialized in this function [-Wmaybe-uninitialized]
   70 |   opt[i]=id;
      |   ~~~~~~^~~
aliens.cpp: In function 'LL take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:109:15: warning: 'res' may be used uninitialized in this function [-Wmaybe-uninitialized]
  109 |  res=dp[N]-res*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...