제출 #757121

#제출 시각아이디문제언어결과실행 시간메모리
757121alexander707070전선 연결 (IOI17_wiring)C++14
7 / 100
1092 ms188400 KiB
#include<bits/stdc++.h>
#define MAXN 100007
using namespace std;

const long long inf=1e15;

int n,m,pt;
int red[MAXN],blue[MAXN];
int to[MAXN],to2[MAXN];

unordered_map<long long,bool> li;
unordered_map<long long,long long> dp;

long long st(long long x,long long y){
    return x*1000000+y;
}

long long ff(int l,int r){
    if(r>to[l] and n+m>500)return inf;
    if(l>to2[r] and n+m>500)return inf;

    if(l==n and r==m)return abs(red[l]-blue[r]);

    if(li[st(l,r)])return dp[st(l,r)];
    li[st(l,r)]=true;
    dp[st(l,r)]=inf;

    if(l<n)dp[st(l,r)]=min(dp[st(l,r)],ff(l+1,r));
    if(r<m)dp[st(l,r)]=min(dp[st(l,r)],ff(l,r+1));
    if(l<n and r<m)dp[st(l,r)]=min(dp[st(l,r)],ff(l+1,r+1));

    dp[st(l,r)]+=abs(red[l]-blue[r]);

    return dp[st(l,r)];
}

long long min_total_length(vector<int> R,vector<int> B){

    n=int(R.size()); m=int(B.size());

    for(int i=1;i<=n;i++)red[i]=R[i-1];
    for(int i=1;i<=m;i++)blue[i]=B[i-1];

    for(int i=n+1;i<=n+10;i++)red[i]=inf;
    for(int i=m+1;i<=m+10;i++)blue[i]=inf;

    pt=0;
    for(int i=1;i<=n;i++){
        while(pt<m and blue[pt+1]<=red[i]){
            pt++;
        }
        to[i]=pt;
    }

    pt=0;
    for(int i=1;i<=m;i++){
        while(pt<n and red[pt+1]<=blue[i]){
            pt++;
        }
        to2[i]=pt;
    }

    pt=1;
    for(int i=1;i<=n;i++){
        while(pt<m and blue[pt+1]<=min(red[i+10],blue[to[i]+10]) ){
            pt++;
        }
        to[i]=pt;
    }

    pt=1;
    for(int i=1;i<=m;i++){
        while(pt<n and red[pt+1]<=min(blue[i+19],red[to2[i]+10])){
            pt++;
        }
        to2[i]=pt;
    }

    return ff(1,1);
}

/*
int main(){
    cout<<min_total_length({1, 2, 3, 7}, {0, 4, 5, 9, 10})<<"\n";
}
*/

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

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:44:38: warning: overflow in conversion from 'long long int' to 'int' changes value from '1000000000000000' to '-1530494976' [-Woverflow]
   44 |     for(int i=n+1;i<=n+10;i++)red[i]=inf;
      |                                      ^~~
wiring.cpp:45:39: warning: overflow in conversion from 'long long int' to 'int' changes value from '1000000000000000' to '-1530494976' [-Woverflow]
   45 |     for(int i=m+1;i<=m+10;i++)blue[i]=inf;
      |                                       ^~~
#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...