This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "aliens.h"
#include<bits/stdc++.h>
#define ll int
#define pb push_back
#define mp make_pair
#define ld long double
#define F first
#define S second
#define pii pair<ll,ll>
using namespace :: std;
const ll maxn=100;
const ll maxk=110;
const ll inf=1e9+900;
const ll logg=20;
ll tav2(ll x){
return x*x;
}
ll mx[maxn];
ll dp[maxn][maxk];
vector<ll> imp;
ll ff[maxn][logg];
ll tt[maxn];
ll C[maxn][maxn];
ll findMn(ll l,ll r){
if(l<0)l=0;
if(r>=maxn)r=maxn-1;
if(l>r)return 0;
ll tol=r-l+1;
return min(ff[l][tt[tol]],ff[r-(1<<tt[tol])+1][tt[tol]]);
}
ll cost(ll i,ll x){
ll t=findMn(x+1,i);
if(t>x || mx[x]>=t){
return tav2(i-t+1);
}
return tav2(i-t+1)-tav2(x-t+1);
}
void update(ll j,ll l,ll r,ll L,ll R){
if(l>=r)return;
ll mid=(l+r)/2;
if(mid==0){
dp[0][j]=0;
return ;
}
pii best=mp(inf,inf);
for(ll i=L;i<R ;i++){
best=min(best,mp(dp[i][j-1]+C[i][mid],i));
}
dp[mid][j]=best.F;
update(j,l,mid,L,best.S+1);
update(j,mid+1,r,best.S,R);
}
long long take_photos(int n, int m, int k, vector<int> r, vector<int> c) {
swap(n,m);
fill(mx,mx+maxn,inf);
for(ll i=0;i<m;i++){
if(c[i]>r[i]){
swap(c[i],r[i]);
}
mx[r[i]]=min(mx[r[i]],(ll)c[i]);
}
for(ll i=0;i<n;i++){
ff[i][0]=mx[i];
}
tt[1]=0;
for(ll i=2;i<maxn;i++){
tt[i]=tt[i/2]+1;
}
for(ll i=1;i<logg;i++){
for(ll j=0;j<n;j++){
ll res=j+(1<<(i-1));
if(res>=n){
ff[j][i]=ff[j][i-1];
}else{
ff[j][i]=min(ff[j][i-1],ff[res][i-1]);
}
}
}
imp.pb(0);
for(ll i=1;i<=n;i++){
if(mx[i-1]!=inf)imp.pb(i);
dp[i][0]=inf;
}
for(ll i=0;i<imp.size();i++){
for(ll j=0;j<i;j++){
C[j][i]=cost(imp[i]-1,imp[j]-1);
}
for(ll j=i;j<imp.size();j++){
C[j][i]=inf;
}
}
for(ll j=1;j<=k;j++){
update(j,0,imp.size(),0,imp.size());
}
return dp[imp.size()-1][k];
}
Compilation message (stderr)
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:90:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(ll i=0;i<imp.size();i++){
~^~~~~~~~~~~
aliens.cpp:94:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(ll j=i;j<imp.size();j++){
~^~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |