Submission #165888

#TimeUsernameProblemLanguageResultExecution timeMemory
165888SegtreeAliens (IOI16_aliens)C++14
16 / 100
244 ms2524 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 510 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); p=0; } else break; } for(int i=0;i<(ll)v.size()-2;i++){ if(crox(v[i],v[i+1])>crox(v[i+1],v[i+2]))cout<<1/0<<endl; } v.push_back(c); for(int i=0;i<(ll)v.size()-2;i++){ if(crox(v[i],v[i+1])>crox(v[i+1],v[i+2]))cout<<1/0<<endl; } } ll qry(ll x){ if(v.size()==0)return 1e17; p=0; /*for(int i=0;i<v.size()-2;i++){ if(crox(v[i],v[i+1])>crox(v[i+1],v[i+2]))cout<<1/0<<endl; }*/ 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][510]; 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++)for(int j=0;j<=K;j++)dp[i][j]=1e17; dp[0][0]=Tei(0); ll ans=1e17; for(int k=1;k<=K;k++){ cht::init(); for(int i=1;i<=n;i++){ cht::add(-2*l[i-1],dp[i-1][k-1]); chmin(dp[i][k],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,dp[i][k]); dp[i][k]+=Tei(i); //cout<<i<<" "<<k<<" "<<dp[i][k]<<endl; } } return ans; }

Compilation message (stderr)

aliens.cpp: In function 'void cht::add(ll, ll)':
aliens.cpp:45:54: warning: division by zero [-Wdiv-by-zero]
      if(crox(v[i],v[i+1])>crox(v[i+1],v[i+2]))cout<<1/0<<endl;
                                                     ~^~
aliens.cpp:49:54: warning: division by zero [-Wdiv-by-zero]
      if(crox(v[i],v[i+1])>crox(v[i+1],v[i+2]))cout<<1/0<<endl;
                                                     ~^~
aliens.cpp: In function 'll cht::qry(ll)':
aliens.cpp:53:2: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  if(v.size()==0)return 1e17; p=0;
  ^~
aliens.cpp:53:30: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  if(v.size()==0)return 1e17; p=0;
                              ^
aliens.cpp:57: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...