제출 #1329173

#제출 시각아이디문제언어결과실행 시간메모리
1329173DanielPr8Wiring (IOI17_wiring)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;
#define f first
#define s second
#define pb push_back
#define all(v) v.begin(),v.end()

long long min_total_length2(std::vector<int> r, std::vector<int> b) {
	vpl ord;
    if(b[0]<r[0])ord.pb({-1e15,1});
    else ord.pb({-1e15,0});
    for(ll i:b)ord.pb({i,0});
    for(ll i:r)ord.pb({i,1});
    sort(all(ord));
    if(ord.back().s==1)ord.pb({1e15,0});
    else ord.pb({1e15,1});
    ll n = ord.size();
    vvl dp(n, vll(4,1e15));
    dp[0][1]=0;
    ll las,ret;
    for(ll i=1,j = 0;j<n; ++i){
        vll al;las=ord[j].f;ll sm=0,am=0;
        for(ll j2=j++;j<n && ord[j].s!=ord[j2].s; ++j){al.pb(ord[j].f);sm+=ord[j].f;}
        if(j==n)break;
        ll nx = ord[j--].f;am=al.size();
        
        for(ll k = 0; k < 4; ++k){
            for(ll p = 0; p < 4; ++p){
                if(al.size()==1){
                    ll ans = dp[i-1][p];
                    if(k>1)ans += nx-al[0];
                    if(p%2==0)ans += al[0]-las;
                    if(k<2 && p%2==1 && k%2==1)ans += min(al[0]-las,nx-al[0]);
                    dp[i][k] = min<ll>(dp[i][k], ans);
                }

                else if(al.size()==2){
                    ll ans = dp[i-1][p];
                    
                    if(p<2 && k%2==1){
                        if(k>1)ans += nx-al[1];
                        else ans += min(nx-al[1],al[1]-las);
                        if(p%2==0)ans += al[0]-las;
                        else ans += min(nx-al[0],al[0]-las);
                    }
                    else if(k%2==1){
                        if(k>1)ans += nx-al[1];
                        else if(p%2==0) ans += al[1]-las;
                        else ans += min(al[1]-las,nx-al[1]);
                        if(p%2==0 && k>1)ans += al[0]-las;
                    }
                    else if(p<2){
                        if(p%2==0)ans += al[0]-las;
                        else if(k>1) ans += nx-al[0];
                        else ans += min(nx-al[0],al[0]-las);
                        if(k>1 && p%2==0)ans += nx-al[1];
                    }
                    else{
                        if(k>1)ans += nx-al[1];
                        if(p%2==0)ans += al[0]-las;
                    }
                    dp[i][k] = min<ll>(dp[i][k], ans);
                }


                else if(k<2){
                    ll ans = dp[i-1][p]+sm-las*am;
                    if(k%2==0)ans -= al.back()-las;
                    if(p>1)ans -= al[0]-las;
                    dp[i][k] = min<ll>(dp[i][k], ans);
                }

                else if(p%2==1){
                    ll ans = dp[i-1][p];
                    if(k==3){
                        ans += nx-al.back();
                        for(ll t = 0; t < al.size()-1; ++t)ans+=min(al[t]-las,nx-al[t]);
                        if(p>1)ans-=min(al[0]-las,nx-al[0]);
                    }
                    else{
                        ans += min(nx-al.back()+al[al.size()-2]-las, nx-al[al.size()-2]);
                        for(ll t = 0; t < al.size()-2; ++t)ans+=min(al[t]-las,nx-al[t]);
                        if(p>1)ans-=min(al[0]-las,nx-al[0]);
                    }
                    dp[i][k] = min<ll>(dp[i][k], ans);
                }
                else{
                    ll ans = dp[i-1][p];
                    if(k==3 && p<2){
                        ans += nx-al.back();
                        ans += al[0]-las;
                        for(ll t = 1; t < al.size()-1; ++t)ans+=min(al[t]-las,nx-al[t]);
                    }
                    else if(p<2){
                        ans += min(nx-al.back()+al[al.size()-2]-las, nx-al[al.size()-2]);
                        ans += al[0]-las;
                        for(ll t = 1; t < al.size()-2; ++t)ans+=min(al[t]-las,nx-al[t]);
                    }
                    else if(k==3){
                        ans += min(al[0]-las+nx-al[1], al[1]-las);
                        ans += nx-al.back();
                        for(ll t = 2; t < al.size()-1; ++t)ans+=min(al[t]-las,nx-al[t]);
                    }
                    else if(al.size()>3){
                        ans += min(nx-al.back()+al[al.size()-2]-las, nx-al[al.size()-2]);
                        ans += min(al[0]-las+nx-al[1], al[1]-las);
                        for(ll t = 2; t < al.size()-2; ++t)ans+=min(al[t]-las,nx-al[t]);
                    }
                    else{
                        ans += min(nx-al[1]+al[0]-las, al[1]-las+nx-al[2]);
                    }
                    dp[i][k] = min<ll>(dp[i][k], ans);
                }

            }
        }
        ret = dp[i][1];
    }
    return ret;
}

long long min_total_length(std::vector<int> r, std::vector<int> b) {
    ll sa=0,sb=0;
    for(ll i:r)sa+=i;
    for(ll i:b)sb+=i;
    return sb-b[0]-(b.size()-1)*r.back()+sa-r.back()-(r.size()-1)*b[0];
}


// int main() {
// 	int n, m;
// 	assert(2 == scanf("%d %d", &n, &m));

// 	vector<int> r(n), b(m);
// 	for(int i = 0; i < n; i++)
// 		assert(1 == scanf("%d", &r[i]));
// 	for(int i = 0; i < m; i++)
// 		assert(1 == scanf("%d", &b[i]));

// 	long long res = min_total_length(r, b);
// 	printf("%lld\n", res);

// 	return 0;
// }


#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...