제출 #361160

#제출 시각아이디문제언어결과실행 시간메모리
361160junodeveloperAliens (IOI16_aliens)C++17
100 / 100
141 ms11096 KiB
#include "aliens.h"
#include <bits/stdc++.h>
#define fi first
#define se second
#define sz(x) ((int)x.size())
using namespace std;
#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif
template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";}
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA...a){
  while(*sdbg!=',')cerr<<*sdbg++;cerr<<"="<<h<<","; _dbg(sdbg+1, a...);
}
typedef long long ll;
struct point {
	ll r,c;
	bool operator<(const point& b)const {
		return r==b.r?c>b.c:r<b.r;
	}
};
struct CHT {
	struct line {
		ll a,b,c;
	};
	vector<line> ln;
	int cur;
	void clear(){cur=0;ln.clear();}
	bool bad(line& a,line& b,line& c) {
		return (a.b-b.b)*(c.a-b.a)>(b.b-c.b)*(b.a-a.a);
	}
	bool bad2(line& a,line& b,ll x) {
		return (b.b-a.b)<x*(a.a-b.a);
	}
	void insert(ll a,ll b,ll c) {
		line t={a,b,c};
		while(sz(ln)>=2&&bad(ln[sz(ln)-2],ln.back(),t))ln.pop_back();
		ln.push_back(t);
	}
	pair<ll,ll> query(ll x) {
		cur=min(cur,sz(ln)-1);
		while(cur+1<sz(ln)&&bad2(ln[cur],ln[cur+1],x))cur++;
		return {x*ln[cur].a+ln[cur].b,ln[cur].c};
	}
}cht;
vector<point> v,tmp;
int n,m,k;
pair<ll,ll> f(ll x) {
	int i;
	pair<ll,ll> cur,pre;
	cht.clear();
	for(i=0;i<n;i++) {
		ll a=-2*(v[i].r-1);
		ll b=(v[i].r-1)*(v[i].r-1)+pre.fi;
		ll c=pre.se;
		if(i&&v[i-1].c>=v[i].r) {
			b-=(v[i-1].c-v[i].r+1)*(v[i-1].c-v[i].r+1);
		}
		//dp[i]=min((c[i]-r[j]+1)*(c[i]-r[j]+1)+dp[j-1])+x;
		cht.insert(a,b,c);
		pair<ll,ll> r=cht.query(v[i].c);
		cur={r.fi+v[i].c*v[i].c+x,r.se+1};
		pre=cur;
	}
	debug(cur.se);
	return cur;
}
long long take_photos(int n_, int m_, int k_, std::vector<int> r_, std::vector<int> c_) {
	v.clear();tmp.clear();
	n=n_,m=m_,k=k_;
	int i,j;
	for(i=0;i<n;i++) {
		if(r_[i]>c_[i])swap(r_[i],c_[i]);
		tmp.push_back({r_[i],c_[i]});
	}
	sort(tmp.begin(),tmp.end());
	for(i=0,j=-1;i<n;i++) {
		if(tmp[i].c>j) {
			j=tmp[i].c;
			v.push_back(tmp[i]);
		}
	}
	n=sz(v);
	ll lo=0,hi=1e13;
	while(lo<hi) {
		ll mid=(lo+hi)/2;
		if(f(mid).se>k)lo=mid+1;
		else hi=mid;
	}
	pair<ll,ll> ans=f(lo);
	return ans.fi-lo*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...