Submission #129652

#TimeUsernameProblemLanguageResultExecution timeMemory
129652DanerZeinWiring (IOI17_wiring)C++14
13 / 100
35 ms2552 KiB
#include "wiring.h"
#include <bits/stdc++.h>
#define MAX 100000000
using namespace std;
typedef pair<int,int> ii;
long long min_total_length(std::vector<int> r, std::vector<int> b) {
    long long s=0,le,ri;
    le=0,ri;
    ri=b.size()-1;
    if(r[r.size()-1]<b[0]){
    while(true){
        s+=abs(r[le]-b[ri]);
        le++;
        ri--;
        if(le==r.size()){
            if(ri==-1)
            break;
            else{
                le--;
                while(true){
                    s+=abs(r[le]-b[ri]);
                    ri--;
                    if(ri==-1){
                        break;
                    }
                }
                break;
            }
        }
        if(ri==-1){
            if(le==r.size()){
                break;
            }
            else{
                ri++;
                while(true){
                    s+=abs(r[le]-b[ri]);
                    le++;
                    if(le==r.size()){
                        break;
                    }
                }
                break;
            }
        }
    }
    if(le!=ri){
        for(int i=le;i<=ri;i++){
            s+=abs(r[le-1]-b[i]);
        }
    }
	return s;
    }
    else{
        int ans=0,ma=-1;
        bool vis[10000];
        int wi[100000];
        memset(wi,-1,sizeof wi);
        memset(vis,false,sizeof vis);
        for(int i=0;i<r.size();i++){
            wi[r[i]]=1;
            ma=max(ma,r[i]);
        }
        for(int i=0;i<b.size();i++){
            wi[b[i]]=2;
            ma=max(ma,b[i]);
        }
        int l,r;
        vector<ii>wire;
        for(int i=0;i<=ma;i++){
            if(wi[i]!=-1){
               // cout<<i<<endl;
                wire.push_back(ii(wi[i],i));
            }
        }
        wire.push_back(ii(wi[ma],ma));
        //cout<<wire[wire.size()-1].second<<endl;
        int left,right;
        ans=0;
        left=right=0;
        for(int i=0;i<wire.size();i++){
            //cout<<wire[i].first<<" "<<wire[i].second<<" "<<ans<<endl;
            if(wire[i].first!=wire[i+1].first){
                continue;
            }
            if(vis[wire[i].second]==true){
                continue;
            }
            int idr,idl;
            idr=idl=-1;
            int tc=wire[i].first;
            for(int j=i+1;j<wire.size();j++){
                right++;
                if(tc!=wire[j].first){
                    idr=j;
                    break;
                }
            }
            for(int j=i-1;j>=0;j--){
                left++;
                if(tc!=wire[j].first){
                    idl=j;
                    break;
                }
            }
            left=right =-1;
            left=abs(wire[i].second-wire[idl].second);
            right=abs(wire[i].second-wire[idr].second);
            if(left>right and idr!=-1){
                ans+=right;
                vis[wire[idr].second]=1;
                vis[wire[i].second]=1;
            }
            else{
                if(idl!=-1){
                ans+=left;
                vis[wire[idl].second]=1;
                vis[wire[i].second]=1;
                }
                else{
                    ans+=right;
                vis[wire[idr].second]=1;
                vis[wire[i].second]=1;
                }
            }
           // printf("wire[i].first: %d wire[i].second: %d ans: %d left: %d right: %d\n",wire[i].first,wire[i].second,ans,left,right);
        }
        return ans;
    }
}
/*
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;
}
*/

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:8:12: warning: right operand of comma operator has no effect [-Wunused-value]
     le=0,ri;
            ^
wiring.cpp:15:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(le==r.size()){
            ~~^~~~~~~~~~
wiring.cpp:31:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if(le==r.size()){
                ~~^~~~~~~~~~
wiring.cpp:39:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                     if(le==r.size()){
                        ~~^~~~~~~~~~
wiring.cpp:60:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<r.size();i++){
                     ~^~~~~~~~~
wiring.cpp:64:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<b.size();i++){
                     ~^~~~~~~~~
wiring.cpp:81:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<wire.size();i++){
                     ~^~~~~~~~~~~~
wiring.cpp:92:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j=i+1;j<wire.size();j++){
                           ~^~~~~~~~~~~~
wiring.cpp:68:13: warning: unused variable 'l' [-Wunused-variable]
         int l,r;
             ^
wiring.cpp:68:15: warning: unused variable 'r' [-Wunused-variable]
         int l,r;
               ^
#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...