제출 #1184274

#제출 시각아이디문제언어결과실행 시간메모리
1184274segfault_ikuyoAliens (IOI16_aliens)C++20
4 / 100
1 ms328 KiB
#include "aliens.h"
#include <bits/stdc++.h>
#define ll long long
#define double long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define l first
#define r second
#define pb push_back
using namespace std;

const int maxn=1e5+5;
int N;
ll dp[maxn],cnt[maxn];
pll res;

vector<pii> seg,seg2;

int cmp(pii a,pii b){
    if(a.l==b.l) return a.r>b.r;
    return a.l<b.l;
}


struct line{
    int a;
    ll b,c;
};

deque<line> dq;

ll gety(line a,int x){
    return a.b*x+a.c;
}

double getidx(line a, line b){
    if(b.b==a.b) return 1e18;
    return (double)(a.c-b.c)/(double)(b.b-a.b);
}

pll check(ll lmb){
    dq.clear();
    dq.push_back({0,-2*(seg[1].l-1ll),dp[0]+pow(seg[1].l-1ll,2)-pow(max(0ll,seg[0].r-(seg[1].l-1ll)),2)});
    for(int i=1;i<seg.size()-1;i++){
        while(dq.size()>1&&gety(dq.front(),seg[i].r)>gety(*(++dq.begin()),seg[i].r)) dq.pop_front();
        
        line u=dq.front();
        //dp[i]=dp[u.a]+lmb+pow((seg[i].r-(seg[u.a+1].l-1ll)),2)-pow(max(0ll,seg[u.a].r-(seg[u.a+1].l-1ll)),2);
        //dp[i]=dp[u.a]+lmb+pow(seg[i].r,2)-2*seg[i].r*(seg[u.a+1].l-1ll)+pow(seg[u.a+1].l-1ll,2)-pow(max(0ll,seg[u.a].r-(seg[u.a+1].l-1ll)),2);
        dp[i]=gety(u,seg[i].r)+pow(seg[i].r,2)+lmb;
        cnt[i]=cnt[u.a]+1;
        line nl={seg[i].r,-2*(seg[i+1].l-1ll),dp[i]+pow(seg[i+1].l-1ll,2)-pow(max(0ll,seg[i].r-(seg[i+1].l-1ll)),2)};

        while(dq.size()>1){
            line la=dq.back();
            line lb=*(--(--dq.end()));
            double idx=getidx(nl,la);
            if(gety(la,idx)<gety(lb,idx)) break;
            else dq.pop_back();
        }
        dq.push_back(nl);
        //cout<<dp[i]<<' '<<cnt[i]<<'\n';
    }
    return {dp[seg.size()-2],cnt[seg.size()-2]};
}

long long take_photos(int n,int m,int k,vector<int> r,vector<int> c){
    N=n;
    for(int i=0;i<n;i++) seg2.pb({min(r[i],c[i]),max(r[i],c[i])});
    sort(seg2.begin(),seg2.end(),cmp);
    seg.push_back({-1,-1});
    for(pii i:seg2) if(seg.back().r<i.r) seg.pb(i);
    seg.push_back({-1,-1});
    ll low=0;
    ll high=1e9;
    ll ans=1e18;
    while(low<=high){
        ll mid=low+(high-low)/2;
        res=check(mid);
        if(res.r<k) {
            high=mid-1;
            ans=min(ans,res.l-mid*res.r);
        }else if(res.r==k){
            low=mid+1;
            ans=min(ans,res.l-mid*k);
        }
        else low=mid+1;
        //cout << mid << ' ' << res.l << ' ' << res.r<<"-------------\n";
    }

    return ans;
}

// 5 7 2 0 3 4 4 4 6 4 5 4 6
// 2 6 10 1 4 4 1
// 2 2 1 0 0 1 1

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

aliens.cpp: In function 'std::pair<long long int, long long int> check(long long int)':
aliens.cpp:43:64: warning: narrowing conversion of '(((__gnu_cxx::__promote_2<long long int, int, double, double>::__type)dp[0] + std::pow<long long int, int>((((long long int)seg.std::vector<std::pair<int, int> >::operator[](1).std::pair<int, int>::first) - 1), 2)) - std::pow<long long int, int>(((long long int)std::max<long long int>(0, (((long long int)seg.std::vector<std::pair<int, int> >::operator[](0).std::pair<int, int>::second) - (((long long int)seg.std::vector<std::pair<int, int> >::operator[](1).std::pair<int, int>::first) - 1)))), 2))' from '__gnu_cxx::__promote_2<long long int, int, double, double>::__type' {aka 'double'} to 'long long int' [-Wnarrowing]
   43 |     dq.push_back({0,-2*(seg[1].l-1ll),dp[0]+pow(seg[1].l-1ll,2)-pow(max(0ll,seg[0].r-(seg[1].l-1ll)),2)});
      |                                       ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
aliens.cpp:52:74: warning: narrowing conversion of '(((__gnu_cxx::__promote_2<long long int, int, double, double>::__type)dp[i] + std::pow<long long int, int>((((long long int)seg.std::vector<std::pair<int, int> >::operator[](((std::vector<std::pair<int, int> >::size_type)(i + 1))).std::pair<int, int>::first) - 1), 2)) - std::pow<long long int, int>(((long long int)std::max<long long int>(0, (((long long int)seg.std::vector<std::pair<int, int> >::operator[](((std::vector<std::pair<int, int> >::size_type)i)).std::pair<int, int>::second) - (((long long int)seg.std::vector<std::pair<int, int> >::operator[](((std::vector<std::pair<int, int> >::size_type)(i + 1))).std::pair<int, int>::first) - 1)))), 2))' from '__gnu_cxx::__promote_2<long long int, int, double, double>::__type' {aka 'double'} to 'long long int' [-Wnarrowing]
   52 |         line nl={seg[i].r,-2*(seg[i+1].l-1ll),dp[i]+pow(seg[i+1].l-1ll,2)-pow(max(0ll,seg[i].r-(seg[i+1].l-1ll)),2)};
      |                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...