제출 #165896

#제출 시각아이디문제언어결과실행 시간메모리
165896SegtreeAliens (IOI16_aliens)C++14
60 / 100
228 ms14824 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include"aliens.h"
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
#define chmin(a,b) a=min(a,b)
#define chmax(a,b) a=max(a,b)
#define N 50010
vector<ll> l,r;
ll Tei(int i){
    ll tei=l[i]*l[i];
    tei-=max(0LL,r[i]-l[i])*max(0LL,r[i]-l[i]);
    return tei;
}

namespace cht{
    struct line{
	ll a,b;
	line(ll a,ll b){
	    this->a=a,this->b=b;
	}
	ll f(ll x){
	    return a*x+b;
	}
    };
    long double crox(line a,line b){
	return (long double)(b.b-a.b)/(long double)(a.a-b.a);
    }
    ll p;
    vector<line> v;
    void add(ll a,ll b){
	if(b>=1e17)return;
	line c=line(a,b);
	while(v.size()>=2){
	    if(crox(v[v.size()-2],v[v.size()-1])>crox(v[v.size()-1],c)){
		v.pop_back();
		chmin(p,(ll)v.size()-1);
	    }
	    else break;
	}
	v.push_back(c);
    }
    ll qry(ll x){
	if(v.size()==0)return 1e17;
	while(p+1<v.size()){
	    if(crox(v[p],v[p+1])<(long double)x)p++;
	    else break;
	}
	return v[p].f(x);
	/*ll ans=1e17;
	for(auto t:v)chmin(ans,t.f(x));
	return ans;*/
    }
    void init(){
	v.clear();
	p=0;
    }
};

ll dp[N],cop[N];
ll take_photos(int n,int m,int K,vector<int> R,vector<int> C){
    vector<P> v;
    for(int i=0;i<n;i++){
	if(R[i]>C[i])swap(R[i],C[i]);
	v.push_back(make_pair((ll)R[i],(ll)-C[i]));
    }
    sort(v.begin(),v.end());
    ll rnd=-1;
    r.push_back(-1);
    for(auto p:v){
	ll x=p.first,y=-p.second+1;
	if(y<=rnd)continue;
	rnd=y;
	l.push_back(x);
	r.push_back(y);
    } 
    n=l.size();
    if(n==1)return (r[1]-l[0])*(r[1]-l[0]);
    for(int i=0;i<=n;i++)dp[i]=1e17;
    dp[0]=Tei(0);
    
    ll ans=1e17;
    for(int k=1;k<=K;k++){
	cht::init();
	for(int i=0;i<=n;i++)cop[i]=1e17;
	for(int i=1;i<=n;i++){
	    cht::add(-2*l[i-1],dp[i-1]);
	    chmin(cop[i],cht::qry(r[i])+r[i]*r[i]);
	    /*for(int j=0;j<i;j++){
		chmin(dp[i][k],dp[j][k-1]-2*r[i]*l[j]+r[i]*r[i]);
	    }*/
	    if(i==n)chmin(ans,cop[i]);
	    cop[i]+=Tei(i);
	    //cout<<i<<" "<<k<<" "<<dp[i][k]<<endl;
	}
	for(int i=0;i<=n;i++)dp[i]=cop[i];
    }
    return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

aliens.cpp: In function 'll cht::qry(ll)':
aliens.cpp:47:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(p+1<v.size()){
        ~~~^~~~~~~~~
#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...