Submission #182394

# Submission time Handle Problem Language Result Execution time Memory
182394 2020-01-09T14:00:55 Z CaroLinda Roller Coaster Railroad (IOI16_railroad) C++14
100 / 100
1216 ms 131588 KB
#include "railroad.h"
#include <bits/stdc++.h>

#define debug printf
#define lp(i,a,b) for(int i = a ; i < b ; i++ )
#define ff first
#define ss second
#define pb push_back
#define mk make_pair
#define ll long long
#define sz size()
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define tiii tuple<int,int,int>
#define mkt make_tuple

const int MAXN = 2e5+10 ;
const ll inf = 1e18+10 ;

using namespace std ;

int n , Key , comp ;
int bit[MAXN*2] , realVal[MAXN*2] , myComp[MAXN*2] , pai[MAXN*2] ;
map<int,int> mp ;
vector<int> adj[MAXN*2] ;
ll ans ;
bool vis[MAXN*2] ;
vector< tuple<int,int,int> > edges ;
set<int> thereIsConnection[MAXN*2] ;

void upd(int pos, int val) { for(int i = pos ; i < MAXN*2 ; i += (i&-i) ) bit[i] += val ; }
int qry(int pos)
{
	int tot = 0 ;
	for(int i = pos ; i > 0 ; i -= (i&-i) )
		tot += bit[i] ;
	return tot;
}

void dfs(int cur)
{

	myComp[cur] = comp ;
	vis[cur] = true ;

	for(int viz : adj[cur])
		if(!vis[viz])
			dfs(viz) ;

}

int find(int i)
{
	if( pai[i] == i ) return i ;
	return pai[i] = find(pai[i]);
}

void join(int a, int b,int cost)
{
	a = find(a) ;
	b = find(b) ;
	if(a == b) return ;
	ans += 1LL * cost ;
	if( rand()%2 ) pai[a] = b ;
	else pai[b] = a ;
}

long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) 
{
    n = (int)(s.sz);

    for(int i : s ) mp[i] = 0 ;
    for(int i : t ) mp[i] = 0 ;

    for(auto &p : mp ) 
    {
    	p.ss = ++Key ;
    	realVal[Key] = p.ff ;
    }

	int val1,val2;
	lp(i,0,n)
	{
		s[i] = mp[ s[i] ] ;
		t[i] = mp[ t[i] ] ;

		if( s[i] == t[i] ) continue ;

		thereIsConnection[ s[i] ].insert(t[i]) ;

		if( s[i] > t[i] ) 
		{
			upd( t[i] , -1 ) ;
			upd( s[i], 1 ) ;
			continue ;
		}

		upd( s[i] , 1 ) ;
		upd( t[i], -1 ) ;

	}
	upd(1,-1) ;
	upd( Key, 1 ) ;
	thereIsConnection[Key].insert(1) ;

	lp(i,1,Key)
	{

		int val = qry(i) ;

		if(val != 0)
		{
			thereIsConnection[i].insert(i+1) ;
			thereIsConnection[i+1].insert(i) ;
		}

		if( val > 0 )
			ans += 1LL*val*(realVal[i+1]-realVal[i]) ;

	}

	lp(i,1,Key)
		for(auto p : thereIsConnection[i]) adj[i].pb(p) ;

	lp(i,1,Key+1)
		if( !vis[i] )
		{
			comp ++ ;
			dfs(i) ;
		}

	lp(i,1,Key)
		if( myComp[i] != myComp[i+1] )
			edges.pb( mkt( realVal[i+1] - realVal[i] , myComp[i] , myComp[i+1] ) ) ;

	sort(all(edges)) ;
	lp(i,1,comp+1) pai[i] = i ;

	for(auto p : edges)
		join( get<1>(p) , get<2>(p) , get<0>(p) ) ;

    return ans ;
}

Compilation message

railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:81:6: warning: unused variable 'val1' [-Wunused-variable]
  int val1,val2;
      ^~~~
railroad.cpp:81:11: warning: unused variable 'val2' [-Wunused-variable]
  int val1,val2;
           ^~~~
# Verdict Execution time Memory Grader output
1 Correct 28 ms 28536 KB n = 2
2 Correct 28 ms 28536 KB n = 2
3 Correct 28 ms 28408 KB n = 2
4 Correct 15 ms 28536 KB n = 2
5 Correct 28 ms 28536 KB n = 2
6 Correct 29 ms 28516 KB n = 2
7 Correct 28 ms 28504 KB n = 3
8 Correct 24 ms 28536 KB n = 3
9 Correct 29 ms 28508 KB n = 3
10 Correct 29 ms 28540 KB n = 8
11 Correct 28 ms 28536 KB n = 8
12 Correct 28 ms 28560 KB n = 8
13 Correct 27 ms 28536 KB n = 8
14 Correct 29 ms 28536 KB n = 8
15 Correct 28 ms 28536 KB n = 8
16 Correct 28 ms 28536 KB n = 8
17 Correct 28 ms 28536 KB n = 8
18 Correct 28 ms 28536 KB n = 8
19 Correct 29 ms 28508 KB n = 3
20 Correct 29 ms 28536 KB n = 7
21 Correct 26 ms 28664 KB n = 8
22 Correct 27 ms 28664 KB n = 8
23 Correct 26 ms 28664 KB n = 8
24 Correct 28 ms 28536 KB n = 8
25 Correct 28 ms 28664 KB n = 8
# Verdict Execution time Memory Grader output
1 Correct 28 ms 28536 KB n = 2
2 Correct 28 ms 28536 KB n = 2
3 Correct 28 ms 28408 KB n = 2
4 Correct 15 ms 28536 KB n = 2
5 Correct 28 ms 28536 KB n = 2
6 Correct 29 ms 28516 KB n = 2
7 Correct 28 ms 28504 KB n = 3
8 Correct 24 ms 28536 KB n = 3
9 Correct 29 ms 28508 KB n = 3
10 Correct 29 ms 28540 KB n = 8
11 Correct 28 ms 28536 KB n = 8
12 Correct 28 ms 28560 KB n = 8
13 Correct 27 ms 28536 KB n = 8
14 Correct 29 ms 28536 KB n = 8
15 Correct 28 ms 28536 KB n = 8
16 Correct 28 ms 28536 KB n = 8
17 Correct 28 ms 28536 KB n = 8
18 Correct 28 ms 28536 KB n = 8
19 Correct 29 ms 28508 KB n = 3
20 Correct 29 ms 28536 KB n = 7
21 Correct 26 ms 28664 KB n = 8
22 Correct 27 ms 28664 KB n = 8
23 Correct 26 ms 28664 KB n = 8
24 Correct 28 ms 28536 KB n = 8
25 Correct 28 ms 28664 KB n = 8
26 Correct 29 ms 28536 KB n = 8
27 Correct 29 ms 28536 KB n = 8
28 Correct 23 ms 28536 KB n = 8
29 Correct 28 ms 28536 KB n = 16
30 Correct 28 ms 28536 KB n = 16
31 Correct 29 ms 28536 KB n = 16
32 Correct 28 ms 28660 KB n = 16
33 Correct 29 ms 28664 KB n = 16
34 Correct 28 ms 28536 KB n = 16
35 Correct 18 ms 28408 KB n = 16
36 Correct 28 ms 28536 KB n = 15
37 Correct 28 ms 28536 KB n = 8
38 Correct 28 ms 28536 KB n = 16
39 Correct 28 ms 28508 KB n = 16
40 Correct 28 ms 28536 KB n = 9
41 Correct 28 ms 28536 KB n = 16
42 Correct 29 ms 28664 KB n = 16
43 Correct 28 ms 28612 KB n = 16
44 Correct 29 ms 28536 KB n = 9
45 Correct 44 ms 28536 KB n = 15
46 Correct 28 ms 28664 KB n = 16
47 Correct 28 ms 28536 KB n = 16
48 Correct 28 ms 28536 KB n = 16
# Verdict Execution time Memory Grader output
1 Correct 1210 ms 129276 KB n = 199999
2 Correct 1215 ms 127828 KB n = 199991
3 Correct 1180 ms 131448 KB n = 199993
4 Correct 933 ms 106512 KB n = 152076
5 Correct 519 ms 76584 KB n = 93249
6 Correct 1048 ms 114612 KB n = 199910
7 Correct 1118 ms 128404 KB n = 199999
8 Correct 1042 ms 114736 KB n = 199997
9 Correct 962 ms 116624 KB n = 171294
10 Correct 772 ms 101028 KB n = 140872
11 Correct 1063 ms 114388 KB n = 199886
12 Correct 1142 ms 123548 KB n = 199996
13 Correct 1046 ms 113584 KB n = 200000
14 Correct 1030 ms 110660 KB n = 199998
15 Correct 1081 ms 108092 KB n = 200000
16 Correct 1058 ms 110408 KB n = 199998
17 Correct 1094 ms 131524 KB n = 200000
18 Correct 1126 ms 120532 KB n = 190000
19 Correct 987 ms 119960 KB n = 177777
20 Correct 470 ms 75740 KB n = 100000
21 Correct 1107 ms 123060 KB n = 200000
22 Correct 1099 ms 100004 KB n = 200000
23 Correct 1162 ms 112708 KB n = 200000
# Verdict Execution time Memory Grader output
1 Correct 28 ms 28536 KB n = 2
2 Correct 28 ms 28536 KB n = 2
3 Correct 28 ms 28408 KB n = 2
4 Correct 15 ms 28536 KB n = 2
5 Correct 28 ms 28536 KB n = 2
6 Correct 29 ms 28516 KB n = 2
7 Correct 28 ms 28504 KB n = 3
8 Correct 24 ms 28536 KB n = 3
9 Correct 29 ms 28508 KB n = 3
10 Correct 29 ms 28540 KB n = 8
11 Correct 28 ms 28536 KB n = 8
12 Correct 28 ms 28560 KB n = 8
13 Correct 27 ms 28536 KB n = 8
14 Correct 29 ms 28536 KB n = 8
15 Correct 28 ms 28536 KB n = 8
16 Correct 28 ms 28536 KB n = 8
17 Correct 28 ms 28536 KB n = 8
18 Correct 28 ms 28536 KB n = 8
19 Correct 29 ms 28508 KB n = 3
20 Correct 29 ms 28536 KB n = 7
21 Correct 26 ms 28664 KB n = 8
22 Correct 27 ms 28664 KB n = 8
23 Correct 26 ms 28664 KB n = 8
24 Correct 28 ms 28536 KB n = 8
25 Correct 28 ms 28664 KB n = 8
26 Correct 29 ms 28536 KB n = 8
27 Correct 29 ms 28536 KB n = 8
28 Correct 23 ms 28536 KB n = 8
29 Correct 28 ms 28536 KB n = 16
30 Correct 28 ms 28536 KB n = 16
31 Correct 29 ms 28536 KB n = 16
32 Correct 28 ms 28660 KB n = 16
33 Correct 29 ms 28664 KB n = 16
34 Correct 28 ms 28536 KB n = 16
35 Correct 18 ms 28408 KB n = 16
36 Correct 28 ms 28536 KB n = 15
37 Correct 28 ms 28536 KB n = 8
38 Correct 28 ms 28536 KB n = 16
39 Correct 28 ms 28508 KB n = 16
40 Correct 28 ms 28536 KB n = 9
41 Correct 28 ms 28536 KB n = 16
42 Correct 29 ms 28664 KB n = 16
43 Correct 28 ms 28612 KB n = 16
44 Correct 29 ms 28536 KB n = 9
45 Correct 44 ms 28536 KB n = 15
46 Correct 28 ms 28664 KB n = 16
47 Correct 28 ms 28536 KB n = 16
48 Correct 28 ms 28536 KB n = 16
49 Correct 1210 ms 129276 KB n = 199999
50 Correct 1215 ms 127828 KB n = 199991
51 Correct 1180 ms 131448 KB n = 199993
52 Correct 933 ms 106512 KB n = 152076
53 Correct 519 ms 76584 KB n = 93249
54 Correct 1048 ms 114612 KB n = 199910
55 Correct 1118 ms 128404 KB n = 199999
56 Correct 1042 ms 114736 KB n = 199997
57 Correct 962 ms 116624 KB n = 171294
58 Correct 772 ms 101028 KB n = 140872
59 Correct 1063 ms 114388 KB n = 199886
60 Correct 1142 ms 123548 KB n = 199996
61 Correct 1046 ms 113584 KB n = 200000
62 Correct 1030 ms 110660 KB n = 199998
63 Correct 1081 ms 108092 KB n = 200000
64 Correct 1058 ms 110408 KB n = 199998
65 Correct 1094 ms 131524 KB n = 200000
66 Correct 1126 ms 120532 KB n = 190000
67 Correct 987 ms 119960 KB n = 177777
68 Correct 470 ms 75740 KB n = 100000
69 Correct 1107 ms 123060 KB n = 200000
70 Correct 1099 ms 100004 KB n = 200000
71 Correct 1162 ms 112708 KB n = 200000
72 Correct 1162 ms 131404 KB n = 200000
73 Correct 1216 ms 127980 KB n = 200000
74 Correct 1190 ms 131532 KB n = 200000
75 Correct 1055 ms 131360 KB n = 200000
76 Correct 1073 ms 131588 KB n = 200000
77 Correct 606 ms 78160 KB n = 200000
78 Correct 639 ms 50096 KB n = 200000
79 Correct 1057 ms 123292 KB n = 184307
80 Correct 365 ms 67700 KB n = 76040
81 Correct 1071 ms 114136 KB n = 199981
82 Correct 1169 ms 123776 KB n = 199994
83 Correct 1088 ms 113432 KB n = 199996
84 Correct 998 ms 110576 KB n = 199998
85 Correct 995 ms 108116 KB n = 200000
86 Correct 1069 ms 110392 KB n = 199998
87 Correct 1104 ms 131556 KB n = 200000
88 Correct 1184 ms 126044 KB n = 200000
89 Correct 1050 ms 131576 KB n = 200000
90 Correct 1101 ms 123100 KB n = 200000
91 Correct 1082 ms 100192 KB n = 200000
92 Correct 1177 ms 112780 KB n = 200000