Submission #173410

#TimeUsernameProblemLanguageResultExecution timeMemory
173410dndhkAliens (IOI16_aliens)C++14
100 / 100
180 ms9716 KiB
#include "aliens.h"
#include <bits/stdc++.h>

#define all(v) (v).begin(), (v).end()
#define sortv(v) sort(all(v))
#define uniqv(v) (v).erase(unique(all(v)), (v).end())
#define pb push_back
#define FI first
#define SE second
#define lb lower_bound
#define ub upper_bound
#define mp make_pair
#define test 0
#define TEST if(test)

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

const int MOD = 1000000007; // 998244353
const int INF = 2e9;
const ll INFLL = 1e12;
const int MAX_N = 100000;

int N, M, K;
vector<pii> vt;
vector<ll> C;
ll dp[MAX_N+1];
bool sf(pii a, pii b){
	if(a.first==b.first){
		return a.second>b.second;
	}
	return a.first<b.first;
}

/*struct Lichao{
	struct NODE{
		int l, r;
		ll a, b;
	};
	ll SZ;
	vector<NODE> seg;
	void add(){
		seg.pb({-1, -1, 0, INFLL});
	}
	void Init(int x){
		SZ = (ll)x;
		add();
		init(0, 0LL, SZ);
	}
	void Reset(){
		for(int i=0; i<seg.size(); i++){
			seg[i].a = 0LL; seg[i].b = INFLL;
		}
	}
	void init(int idx, ll s, ll e){
		if(s==e)	return;
		seg[idx].l = seg.size(); add();
		seg[idx].r = seg.size(); add();
		init(seg[idx].l ,s, (s+e)/2); init(seg[idx].r, (s+e)/2+1, e);
	}
	void Update(ll a, ll b){
		update(0, 0LL, SZ, a, b);
	}
	void update(int idx, ll s, ll e, ll x, ll y){
		if(s*x+y<=seg[idx].a*s+seg[idx].b && e*x+y<=seg[idx].a*e+seg[idx].b){
			seg[idx].a = x;
			seg[idx].b = y;
			return;
		}else if(s*x+y>=seg[idx].a*s+seg[idx].b && e*x+y>=seg[idx].a*e+seg[idx].b){
			return;
		}
		update(seg[idx].l, s, (s+e)/2, x, y);
		update(seg[idx].r, (s+e)/2+1, e, x, y);
	}
	ll Calc(ll x){
		return calc(0, 0LL, SZ, x);
	}
	ll calc(int idx, ll s, ll e, ll k){
		if(s==e){
			return seg[idx].a * k + seg[idx].b;
		}
		if(k<=(s+e)/2){
			return min(seg[idx].a * k + seg[idx].b, calc(seg[idx].l, s, (s+e)/2, k));
		}else{
			return min(seg[idx].a * k + seg[idx].b, calc(seg[idx].r, (s+e)/2+1, e, k));
		}
	}
}Seg;*/

struct S{
	ll a, b;
	int idx;
};

vector<S> st;
int idx = 0;

void add(ll a, ll b, int i){
	while(st.size()>=2){
		S prv = st.back(); st.pop_back();
		if((b-prv.b) * (prv.a - st.back().a) >= (a-prv.a) * (prv.b - st.back().b)){
			if(idx==st.size())	idx--;
			continue;
		}else{
			st.pb(prv);
			break;
		}
	}
	st.pb({a, b, i});
}
int cnt[MAX_N+1];

ll calc(ll x, int i){
	while(idx+1<st.size()){
		if(st[idx+1].a * x + st[idx+1].b < st[idx].a * x + st[idx].b) idx++;
		else	break;
	}
	cnt[i] = cnt[st[idx].idx]+1;
	return st[idx].a * x + st[idx].b;
}

int solve(ll x){
	//TEST cout<<x<<endl;
	st.clear();
	idx = 0;
	for(int i=0; i<vt.size(); i++){
		//TEST cout<<dp[i]<<" ";
		add(-4LL * (ll)vt[i].first, dp[i] - 2LL * C[i] + 2LL * (ll)vt[i].first * (ll)vt[i].first, i);
		dp[i+1] = 2LL * (ll)vt[i].second * (ll)vt[i].second + calc((ll)vt[i].second, i+1) + x;
	}//TEST cout<<dp[vt.size()]<<endl<<cnt[vt.size()]<<endl<<dp[vt.size()] - (ll)cnt[vt.size()] * x<<endl<<endl;
	return cnt[vt.size()];
}

long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) {
	N = n; M = m; K = k;
	for(int i=0; i<N; i++){
		vt.pb({min(r[i], c[i]), max(r[i], c[i]) + 1});
	}
	sort(vt.begin(), vt.end(), sf);
	int mx = -1;
	for(int i=0 ;i<N; i++){
		if(mx>=vt[i].second){
			vt[i].second = INF;
			vt[i].first = INF;
		}else mx = max(mx, vt[i].second);
	}
	sort(vt.begin(), vt.end());
	while(!vt.empty() && vt.back().first==INF && vt.back().second==INF)	vt.pop_back();
	C.pb(0LL);
	for(int i=1; i<vt.size(); i++){
		C.pb(max(0LL, (ll)(vt[i-1].second - vt[i].first)) * max(0LL, (ll)(vt[i-1].second - vt[i].first)));
	}
	ll s = 0, e = (ll)M*(ll)M, mid;
	while(s<e){
		mid = (s+e)/2LL;
		int t = solve(2LL*mid+1LL);
		if(t<=K){
			e = mid;
		}else{
			s = mid+1LL;
		}
	}
	solve(2LL*s);
	return (dp[vt.size()] - 2LL * s * (ll)K)/2LL;
}

Compilation message (stderr)

aliens.cpp: In function 'void add(ll, ll, int)':
aliens.cpp:106:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if(idx==st.size()) idx--;
       ~~~^~~~~~~~~~~
aliens.cpp: In function 'll calc(ll, int)':
aliens.cpp:118:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(idx+1<st.size()){
        ~~~~~^~~~~~~~~~
aliens.cpp: In function 'int solve(ll)':
aliens.cpp:130:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<vt.size(); i++){
               ~^~~~~~~~~~
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:154:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1; i<vt.size(); i++){
               ~^~~~~~~~~~
#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...