Submission #698885

#TimeUsernameProblemLanguageResultExecution timeMemory
698885NemanjaSo2005Aliens (IOI16_aliens)C++14
0 / 100
1 ms232 KiB
#include "aliens.h" #include<bits/stdc++.h> #define ll long long using namespace std; ll N,M,K; ll dp[100005],c1=0,v1,c2=1e6,v2,cnt[100005]; struct tacka{ ll x,y;/// X i Y su kao u matematici } tniz[100005],niz[100005],tpp; stack<tacka> S; bool pox(tacka a,tacka b){ if(a.x<b.x) return true; if(a.x>b.x) return false; return a.y<b.y; } ll koliko(ll x,ll y,ll px){ ll r=abs(x-y); ll d=r+1; if((x-px)>=d) return d*d; ll a=d*d-(d-(x-px))*(d-(x-px)); return a; } struct funk{ ll offset,slope; int id; ll evaluiraj(ll gde){ return gde*slope+offset; } }pp; vector<funk> C; void dodaj(funk x){ C.push_back(x); } int koja(ll gde){ if(C.size()==0) return 0; int ret=C[0].id; ll vred=C[0].evaluiraj(gde); for(int i=1;i<C.size();i++){ ll v2=C[i].evaluiraj(gde); if(v2<vred){ vred=v2; ret=C[i].id; } } return ret; } ll izracunaj(ll lmb){ C.clear(); dp[0]=0; cnt[0]=0; for(ll i=1;i<=N;i++){ dp[i]=dp[i-1]+koliko(niz[i].x,niz[i].y,niz[i-1].x)-lmb; cnt[i]=cnt[i-1]+1; ll gde=0,vred=1e18; for(ll j=i-1;j>=1;j--){ pp.slope=-2*(niz[j].y-1); pp.id=j; if(-niz[j-1].x>=-niz[j].y+1) pp.offset=(niz[j].y-1)*(niz[j].y-1)+dp[j-1]-lmb; else pp.offset=(niz[j].y-1)*(niz[j].y-1) - (-niz[j].y+1+niz[j-1].x)*(-niz[j].y+1+niz[j-1].x)+dp[j-1]-lmb; ll val=pp.evaluiraj(niz[i].x); if(val<vred){ vred=val; gde=j; } } if(vred+niz[i].x*niz[i].x<dp[i]){ dp[i]=vred+niz[i].x*niz[i].x; cnt[i]=cnt[gde]+1; } } if(cnt[N]<=K and cnt[N]>c1){ c1=cnt[N]; v1=dp[N]+lmb*cnt[N]; } if(cnt[N]>K and cnt[N]<c2){ c2=cnt[N]; v2=dp[N]+lmb*cnt[N]; } return dp[N]+lmb*cnt[N]; } long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) { /*while(true){ ll a,b,c,d; cin>>a>>b>>c>>d; cout<<koliko(a,b,c,d)<<endl; }*/ N=n; M=m; K=k; for(ll i=1;i<=N;i++){ tniz[i].x=c[i-1]+1; tniz[i].y=r[i-1]+1; } for(ll i=1;i<=N;i++) if(tniz[i].x<tniz[i].y) swap(tniz[i].x,tniz[i].y); sort(tniz+1,tniz+1+N,pox); tpp.x=-1; tpp.y=-1e9; S.push(tpp); // cout<<N<<endl; //for(ll i=1;i<=N;i++) // cout<<tniz[i].x<<" "<<tniz[i].y<<endl; for(ll i=1;i<=N;i++){ if(S.top().x==tniz[i].x) continue; while(S.top().y>=tniz[i].y) S.pop(); S.push(tniz[i]); } for(ll i=1;i<=N;i++){ niz[i].x=0; niz[i].y=0; } N=S.size()-1; for(ll i=N;i>=1;i--){ niz[i]=S.top(); S.pop(); } //cout<<N<<endl; //for(ll i=1;i<=N;i++) // cout<<niz[i].x<<" "<<niz[i].y<<endl; if(K>N) K=N; niz[0].x=niz[0].y=-1e9; ll dg=-M*M,ret=0,gg=0,sred; while(dg<=gg){ sred=(dg+gg)/2; izracunaj(sred); if(cnt[N]<=K){ dg=sred+1; ret=dg; } else gg=sred-1; } //cout<<sred<<endl; ll res=v1; res=min(res,v1+((v2-v1)/(c2-c1))*(K-c1)); dg=-M*M; gg=ret; ll v1,v2; while(dg<=gg){ sred=(dg+gg)/2; v1=izracunaj(sred-1); v2=izracunaj(sred); res=min(res,v1); res=min(res,v2); if(v2<v1) dg=sred+1; else gg=sred-1; } return res; }

Compilation message (stderr)

aliens.cpp: In function 'int koja(long long int)':
aliens.cpp:42:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<funk>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |    for(int i=1;i<C.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...