답안 #58141

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
58141 2018-07-17T03:22:42 Z spencercompton Roller Coaster Railroad (IOI16_railroad) C++17
0 / 100
881 ms 82340 KB
#include "railroad.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
vector<int> comp[400000];
int id[400000];
int sz[400000];
bool mg(int a, int b){
    if(id[a]==id[b]){
        return false;
    }
    int ca = id[a];
    int cb = id[b];
    if(sz[ca] > sz[cb]){
        swap(ca,cb);
    }
    for(int i = 0; i<comp[ca].size(); i++){
        comp[cb].push_back(comp[ca][i]);
        id[comp[ca][i]] = cb;
        sz[cb]++;
    }
    comp[ca].clear();
    return true;
}
long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
    int n = (int) s.size();
    vector<int> all;
    int point = 0;
    map<int, int> m;
    for(int i = 0; i<n; i++){
    	all.push_back(s[i]);
    	all.push_back(t[i]);
    }
    sort(all.begin(),all.end());
    vector<int> rev;
    for(int i = 0; i<2*n; i++){
    	if(i==0 || all[i-1]!=all[i]){
    		m[all[i]] = point++;
    		rev.push_back(all[i]);
    	}
    }
    int nn = point;
    int bal[nn];
    //in - out
    // bal = 3 -> (((
    for(int i=  0; i<n; i++){
    	s[i] = m[s[i]];
    	t[i] = m[t[i]];
    }
    for(int i = 0; i<nn; i++){
        bal[i] = 0;
    }
    for(int i = 0; i<n; i++){
    	bal[s[i]]--;
    	bal[t[i]]++;
    }
    vector<pair<int, bool> > li;
    //ind, open
    vector<pair<int, int> > did;
    for(int i = 0; i<nn; i++){
    	if(bal[i]>0){
    		for(int j = 1; j<=bal[i]; j++){
    			li.push_back(make_pair(i,true));
    		}
    	}
    	else{
    		for(int j = -1; j>=bal[i]; j--){
    			if(li.size()>0 && li[li.size()-1].second){
    				did.push_back(make_pair(li[li.size()-1].first,i));
                    li.pop_back();
    			}
    			else{
    				li.push_back(make_pair(i,false));
    			}
    		}
    	}
    }
    int p1 = 1;
    int p2 = li.size()-2;
    ll ans = 0LL;
    if(p1<p2){
        did.push_back(make_pair(li[p1].first,li[p2].first));
    }
    sort(did.begin(),did.end());
    while(p1<p2){
    	ans += (ll)(rev[li[p2].first] - rev[li[p1].first]);
        p1++;
        p2--;
    }
    bool imp[nn];
    
    for(int i = 0; i<nn; i++){
        imp[i] = false;
        comp[i].push_back(i);
        id[i] = i;
        sz[i] = 1;
    }
    for(int i = 0; i<n; i++){
        imp[s[i]] = true;
        imp[t[i]] = true;
    }
    vector<int> allimp;
    for(int i = 0; i<nn; i++){
        if(imp[i]){
            allimp.push_back(i);
        }
    }
    int st = -1;
    int en = -1;
    for(int i = 0; i<did.size(); i++){
        if(st==-1){
            st = did[i].first;
            en = did[i].second;
        }
        else if(did[i].first <= en){
            en = max(en,did[i].second);
        }
        else{
            for(int j = st+1; j<=en; j++){
                mg(st,j);
            }
            st = did[i].first;
            en = did[i].second;
        }
    }
    if(st!=-1){
        for(int j = st+1; j<=en; j++){
            mg(st,j);
        }
    }
    for(int i = 0; i<n; i++){
        mg(s[i],t[i]);
    }
    vector<pair<ll, pair<int, int> > > eds;
    for(int i = 1; i<allimp.size(); i++){
        eds.push_back(make_pair(rev[allimp[i]]-rev[allimp[i-1]],make_pair(allimp[i-1],allimp[i])));
    }
    sort(eds.begin(),eds.end());
    for(int i = 0; i<eds.size(); i++){
        bool use = mg(eds[i].second.first,eds[i].second.second);
        if(use){
            ans += eds[i].first;
        }
    }
    return ans;
}

Compilation message

railroad.cpp: In function 'bool mg(int, int)':
railroad.cpp:18:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i<comp[ca].size(); i++){
                    ~^~~~~~~~~~~~~~~~
railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:111:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i<did.size(); i++){
                    ~^~~~~~~~~~~
railroad.cpp:136:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 1; i<allimp.size(); i++){
                    ~^~~~~~~~~~~~~~
railroad.cpp:140:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i<eds.size(); i++){
                    ~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 9720 KB n = 2
2 Correct 11 ms 9840 KB n = 2
3 Correct 10 ms 9840 KB n = 2
4 Correct 10 ms 9840 KB n = 2
5 Correct 10 ms 9840 KB n = 2
6 Correct 10 ms 9908 KB n = 2
7 Correct 12 ms 9908 KB n = 3
8 Correct 11 ms 9908 KB n = 3
9 Correct 10 ms 9908 KB n = 3
10 Correct 12 ms 9928 KB n = 8
11 Incorrect 13 ms 9960 KB answer is not correct: 386614500 instead of 189002015
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 9720 KB n = 2
2 Correct 11 ms 9840 KB n = 2
3 Correct 10 ms 9840 KB n = 2
4 Correct 10 ms 9840 KB n = 2
5 Correct 10 ms 9840 KB n = 2
6 Correct 10 ms 9908 KB n = 2
7 Correct 12 ms 9908 KB n = 3
8 Correct 11 ms 9908 KB n = 3
9 Correct 10 ms 9908 KB n = 3
10 Correct 12 ms 9928 KB n = 8
11 Incorrect 13 ms 9960 KB answer is not correct: 386614500 instead of 189002015
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 791 ms 70316 KB n = 199999
2 Correct 881 ms 73492 KB n = 199991
3 Correct 851 ms 78292 KB n = 199993
4 Correct 657 ms 78292 KB n = 152076
5 Correct 333 ms 78292 KB n = 93249
6 Incorrect 788 ms 82340 KB answer is not correct: 1 instead of 0
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 9720 KB n = 2
2 Correct 11 ms 9840 KB n = 2
3 Correct 10 ms 9840 KB n = 2
4 Correct 10 ms 9840 KB n = 2
5 Correct 10 ms 9840 KB n = 2
6 Correct 10 ms 9908 KB n = 2
7 Correct 12 ms 9908 KB n = 3
8 Correct 11 ms 9908 KB n = 3
9 Correct 10 ms 9908 KB n = 3
10 Correct 12 ms 9928 KB n = 8
11 Incorrect 13 ms 9960 KB answer is not correct: 386614500 instead of 189002015
12 Halted 0 ms 0 KB -