Submission #389691

# Submission time Handle Problem Language Result Execution time Memory
389691 2021-04-14T11:31:05 Z mehrdad_sohrabi Aliens (IOI16_aliens) C++14
0 / 100
5 ms 8532 KB
// Black lives matter
#include <bits/stdc++.h>
#include "aliens.h"

/// 500 485 462 A4
using namespace std;
typedef long long int ll;
typedef complex<double> point;
typedef long double ld;
#define pb push_back
#define pii pair < ll , ll >
#define F first
#define S second
//#define endl '\n'
#define int long long
#define sync ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#define kill(x) return cout<<x<<'\n', 0;
const int N=5e4+10,M=1e6+100,inf=(ll)1e15;
ll dp[N];
ll T[N];
ll A[M];
vector <pii> B;
/*
void solve(ll l,ll r,ll L,ll R,ll k){
    if (r<l) return;
    ll mid=(r+l)/2;
    ll id=0,mx=inf;
    for (int i=L;i<=min(R,mid);i++){
        ll z=0;
        if (i>1){
            if (B[i-1].F<B[i-2].S){
                z=(B[i-2].S-B[i-1].F)*((B[i-2].S-B[i-1].F));
            }
        }
        ll x=dp[i-1][(k-1)%2]+(B[mid-1].S-B[i-1].F)*(B[mid-1].S-B[i-1].F)-z;
        if (mx>x){
            mx=x;
            id=i;
        }
    }
    dp[mid][k%2]=mx;
 //   cout << l << " " << r << " " << mid << " " << k << " " << mx << endl;
    solve(l,mid-1,L,id,k);
    solve(mid+1,r,id,R,k);
}
*/
vector <pair <int,pair <pii,int> > > line;
ll intersect(pii x,pii y){
    if (x.F==y.F){
        cout << 1/0;
        if (x.S<=y.S) return -inf;
        else return inf;
    }
    return (y.S-x.S)/(x.F-y.F)+((y.S-x.S)%(x.F-y.F)>0);
}
ll Z[N];
void add(pair <pii,int> X){
    pii x=X.F;
    while(line.size()){
        pii y=line.back().S.F;
        ll z=intersect(x,y);
        if (z<=line.back().F){
            line.pop_back();
        }
        else{
            line.pb({z,{x,X.S}});
            return ;
        }
    }
    line.pb({-inf,X});
}
pii get(ll x){
    auto t=lower_bound(line.begin(),line.end(),pair <int,pair <pii,int> > ({x,{{inf,inf},inf}}))-line.begin();
    t--;
    pii p=line[t].S.F;
    return {x*p.F+p.S,line[t].S.S};
}
long long take_photos(int32_t n, int32_t m, int32_t k, std::vector<int32_t> r, std::vector<int32_t> c){
    for (int i=0;i<M;i++) A[i]=i;
    for (int i=0;i<n;i++){
        ll x=r[i],y=c[i];
        A[max(x,y)]=min(A[max(x,y)],min(x,y)-1);
    }
    for (int i=0;i<m;i++){
        if (A[i]<i){
            while(B.size() && B.back().F>=A[i]) B.pop_back();
            B.pb({A[i],i});
        }
    }
  //  for (auto u : B){
   //     cout << u.F << " " << u.S << endl;
    //}
    ll t=B.size();
    ll l=-1,rr=(ll)1e13;
    ll ans=inf;
    while(rr-l>1){
        line.clear();
        ll mid=(rr+l)/2;
        for (int i=1;i<=t;i++){
            dp[i]=(B[i-1].S-B[0].F)*(B[i-1].S-B[0].F)+mid;
        }
        memset(T,0,sizeof T);
        T[1]=1;
        for (int j=2;j<=t;j++){
            ll ww=dp[j];
            T[j]=1;
            ll z=0;
            if (B[j-1].F<B[j-2].S){
                z=(B[j-2].S-B[j-1].F)*((B[j-2].S-B[j-1].F));
            }
            Z[j-1]=z;
            add({{2*B[j-1].F,-(dp[j-1]-z+B[j-1].F*B[j-1].F+mid)},T[j-1]});
            pii p=get(B[j-1].S);
            ll x=-p.F+B[j-1].S*B[j-1].S;
            if (x<dp[j]){
                dp[j]=x;
                T[j]=p.S+1;
            }
            ll mx=ww,q=1;
           // if (mid==0) cout << mx << endl;
            for (int f=1;f<j;f++){
                if (dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid==mx && q>T[f]+1){
                    mx=dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid;
                    q=T[f]+1;
                }
                if (dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid<mx){
                    mx=dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid;
                    q=T[f]+1;
                }
            }
            if (mx!=dp[j]) cout << 1/0;
            dp[j]=mx;
            //if (mx!=dp[j] || q<T[j]) cout << mx << " " << dp[j] << " " << q << " " << T[j] << endl;
            T[j]=q;

        }
        if (T[t]<=k){
       //     cout << mid << endl;
            ans=min(ans,dp[t]-k*mid);
            rr=mid;
        }
        else l=mid;
    }
    return ans;
}
/*
int32_t main() {
    int n, m, k;
    assert(3 == scanf("%d %d %d", &n, &m, &k));
    std::vector<int32_t> r(n), c(n);
    for (int i = 0; i < n; i++) {
        assert(2 == scanf("%d %d", &r[i], &c[i]));
    }
    long long ans = take_photos(n, m, k, r, c);


    printf("%lld\n", ans);
    return 0;
}
*/
/*
5 7 2
0 3
4 4
4 6
4 5
4 6
*/
//take_photos(5, 7, 2, [0, 4, 4, 4, 4], [3, 4, 6, 5, 6])

Compilation message

aliens.cpp: In function 'll intersect(std::pair<long long int, long long int>, std::pair<long long int, long long int>)':
aliens.cpp:51:18: warning: division by zero [-Wdiv-by-zero]
   51 |         cout << 1/0;
      |                 ~^~
aliens.cpp: In function 'long long int take_photos(int32_t, int32_t, int32_t, std::vector<int>, std::vector<int>)':
aliens.cpp:132:37: warning: division by zero [-Wdiv-by-zero]
  132 |             if (mx!=dp[j]) cout << 1/0;
      |                                    ~^~
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8524 KB Correct answer: answer = 4
2 Incorrect 5 ms 8524 KB Wrong answer: output = -4999999999995, expected = 4
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8532 KB Correct answer: answer = 1
2 Correct 5 ms 8528 KB Correct answer: answer = 4
3 Incorrect 5 ms 8524 KB Wrong answer: output = -4999999999998, expected = 1
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8524 KB Correct answer: answer = 4
2 Incorrect 5 ms 8524 KB Wrong answer: output = -4999999999995, expected = 4
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8524 KB Correct answer: answer = 4
2 Incorrect 5 ms 8524 KB Wrong answer: output = -4999999999995, expected = 4
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8524 KB Correct answer: answer = 4
2 Incorrect 5 ms 8524 KB Wrong answer: output = -4999999999995, expected = 4
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8524 KB Correct answer: answer = 4
2 Incorrect 5 ms 8524 KB Wrong answer: output = -4999999999995, expected = 4
3 Halted 0 ms 0 KB -