Submission #135011

# Submission time Handle Problem Language Result Execution time Memory
135011 2019-07-23T14:15:34 Z tmwilliamlin168 Simurgh (IOI17_simurgh) C++14
100 / 100
952 ms 8392 KB
#include "simurgh.h"
#include <bits/stdc++.h>
using namespace std;

const int mxN=500, mxM=mxN*(mxN-1)/2;
int n, tin[mxN], low[mxN], dt=1, b[mxM], bs, st[mxM], sth, t[mxN], p[mxN];
vector<int> eu, ev, adj[mxN], ans;
bool c[mxN];

void dfs1(int u=0, int p=-1) {
	tin[u]=low[u]=dt++;
	for(int e : adj[u]) {
		int v=eu[e]^ev[e]^u;
		if(!tin[v]) {
			st[sth++]=e;
			dfs1(v, u);
			low[u]=min(low[v], low[u]);
			if(low[v]>=tin[u]) {
				do {
					b[st[--sth]]=bs;
				} while(st[sth]^e);
				++bs;
			}
		} else if(v^p&&tin[v]<tin[u]) {
			st[sth++]=e;
			low[u]=min(tin[v], low[u]);
		}
	}
}

int find(int x) {
	return x^p[x]?p[x]=find(p[x]):x;
}

bool join(int x, int y) {
	if((x=find(x))==(y=find(y)))
		return 0;
	p[x]=y;
	return 1;
}

void fst(vector<int> w, vector<int> &r) {
	for(int i=0; i<eu.size(); ++i)
		if(w[i]&&join(eu[i], ev[i]))
			r.push_back(i);
}

void dc(vector<int> &a, vector<int> &b, vector<int> &c, int l, int r, int s1, int s2) {
	if(s2==s1)
		return;
	if(l==r) {
		c.push_back(b[l]);
		return;
	}
	int m=(l+r)/2;
	vector<int> d=a;
	for(int i=l; i<=m; ++i)
		d[i]=b[i];
	int sl=count_common_roads(d);
	dc(a, b, c, l, m, s1, sl);
	dc(a, b, c, m+1, r, s1, s2-sl+s1);
}

void dfs2(int u=0, int pe=-1) {
	vector<int> v1, v2, r;
	for(int e : adj[u]) {
		int v=eu[e]^ev[e]^u;
		if(c[v])
			continue;
		if(t[v]<0) {
			v2.push_back(e);
			t[v]=e;
		} else
			v1.push_back(e);
	}
	if(v1.size()) {
		iota(p, p+n, 0);
		vector<int> s1, w(eu.size(), 1), s2=v1;
		for(int i=0; i<v1.size(); ++i) {
			s1.push_back(t[eu[v1[i]]^ev[v1[i]]^u]);
			join(eu[s1.back()], ev[s1.back()]);
		}
		for(int e : ans) {
			s1.push_back(e);
			join(eu[e], ev[e]);
		}
		for(int e : v1) {
			w[e]=0;
			w[t[eu[e]^ev[e]^u]]=0;
		}
		fst(w, s1);
		s2.insert(s2.end(), s1.begin()+v1.size(), s1.end());
		dc(s1, v1, r, 0, v1.size()-1, count_common_roads(s1), count_common_roads(s2));
	}
	if(v2.size()) {
		vector<int> w(eu.size(), 1), s;
		for(int e : adj[u])
			w[e]=0;
		iota(p, p+n, 0);
		fst(w, s);
		for(int e : r)
			if(join(eu[e], ev[e]))
				s.push_back(e);
		if(~pe&&join(eu[pe], ev[pe]))
			s.push_back(pe);
		for(int e : adj[u])
			if(join(eu[e], ev[e]))
				s.push_back(e);
		int bc=count_common_roads(s);
		sort(v2.begin(), v2.end(), [](const int &i, const int &j) {
			return b[i]<b[j];
		});
		for(int i=0, j=0, o; i<v2.size(); ) {
			for(; j<v2.size()&&b[v2[j]]==b[v2[i]]; ++j);
			for(int e : s)
				if(b[e]==b[v2[i]]&&(eu[e]==u||ev[e]==u))
					o=e;
			s.erase(find(s.begin(), s.end(), o));
			vector<int> a;
			int cm=bc;
			for(; i<j; ++i) {
				s.push_back(v2[i]);
				int cc=count_common_roads(s);
				if(cc>cm) {
					cm=cc;
					a=vector<int>();
				}
				if(cc==cm)
					a.push_back(v2[i]);
				s.pop_back();
			}
			s.push_back(o);
			r.insert(r.end(), a.begin(), a.end());
		}
	}
	for(int e : r) {
		ans.push_back(e);
		c[eu[e]^ev[e]^u]=1;
	}
	for(int e : r)
		dfs2(eu[e]^ev[e]^u, e);
}

vector<int> find_roads(int n, vector<int> u, vector<int> v) {
	::n=n;
	eu=u;
	ev=v;
	for(int i=0; i<u.size(); ++i) {
		adj[u[i]].push_back(i);
		adj[v[i]].push_back(i);
	}
	dfs1();
	c[0]=1;
	memset(t, -1, 4*n);
	dfs2();
	return ans;
}

Compilation message

simurgh.cpp: In function 'void fst(std::vector<int>, std::vector<int>&)':
simurgh.cpp:43:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<eu.size(); ++i)
               ~^~~~~~~~~~
simurgh.cpp: In function 'void dfs2(int, int)':
simurgh.cpp:79:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0; i<v1.size(); ++i) {
                ~^~~~~~~~~~
simurgh.cpp:113:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0, j=0, o; i<v2.size(); ) {
                        ~^~~~~~~~~~
simurgh.cpp:114:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(; j<v2.size()&&b[v2[j]]==b[v2[i]]; ++j);
          ~^~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:148:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<u.size(); ++i) {
               ~^~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB correct
2 Correct 2 ms 376 KB correct
3 Correct 2 ms 376 KB correct
4 Correct 2 ms 372 KB correct
5 Correct 2 ms 376 KB correct
6 Correct 2 ms 376 KB correct
7 Correct 2 ms 376 KB correct
8 Correct 2 ms 376 KB correct
9 Correct 2 ms 412 KB correct
10 Correct 2 ms 376 KB correct
11 Correct 2 ms 376 KB correct
12 Correct 2 ms 376 KB correct
13 Correct 2 ms 376 KB correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB correct
2 Correct 2 ms 376 KB correct
3 Correct 2 ms 376 KB correct
4 Correct 2 ms 372 KB correct
5 Correct 2 ms 376 KB correct
6 Correct 2 ms 376 KB correct
7 Correct 2 ms 376 KB correct
8 Correct 2 ms 376 KB correct
9 Correct 2 ms 412 KB correct
10 Correct 2 ms 376 KB correct
11 Correct 2 ms 376 KB correct
12 Correct 2 ms 376 KB correct
13 Correct 2 ms 376 KB correct
14 Correct 4 ms 376 KB correct
15 Correct 2 ms 376 KB correct
16 Correct 3 ms 504 KB correct
17 Correct 4 ms 376 KB correct
18 Correct 3 ms 376 KB correct
19 Correct 4 ms 376 KB correct
20 Correct 3 ms 376 KB correct
21 Correct 3 ms 376 KB correct
22 Correct 3 ms 376 KB correct
23 Correct 3 ms 412 KB correct
24 Correct 3 ms 376 KB correct
25 Correct 2 ms 376 KB correct
26 Correct 3 ms 376 KB correct
27 Correct 3 ms 376 KB correct
28 Correct 3 ms 376 KB correct
29 Correct 3 ms 376 KB correct
30 Correct 3 ms 376 KB correct
31 Correct 3 ms 380 KB correct
32 Correct 3 ms 504 KB correct
33 Correct 2 ms 376 KB correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB correct
2 Correct 2 ms 376 KB correct
3 Correct 2 ms 376 KB correct
4 Correct 2 ms 372 KB correct
5 Correct 2 ms 376 KB correct
6 Correct 2 ms 376 KB correct
7 Correct 2 ms 376 KB correct
8 Correct 2 ms 376 KB correct
9 Correct 2 ms 412 KB correct
10 Correct 2 ms 376 KB correct
11 Correct 2 ms 376 KB correct
12 Correct 2 ms 376 KB correct
13 Correct 2 ms 376 KB correct
14 Correct 4 ms 376 KB correct
15 Correct 2 ms 376 KB correct
16 Correct 3 ms 504 KB correct
17 Correct 4 ms 376 KB correct
18 Correct 3 ms 376 KB correct
19 Correct 4 ms 376 KB correct
20 Correct 3 ms 376 KB correct
21 Correct 3 ms 376 KB correct
22 Correct 3 ms 376 KB correct
23 Correct 3 ms 412 KB correct
24 Correct 3 ms 376 KB correct
25 Correct 2 ms 376 KB correct
26 Correct 3 ms 376 KB correct
27 Correct 3 ms 376 KB correct
28 Correct 3 ms 376 KB correct
29 Correct 3 ms 376 KB correct
30 Correct 3 ms 376 KB correct
31 Correct 3 ms 380 KB correct
32 Correct 3 ms 504 KB correct
33 Correct 2 ms 376 KB correct
34 Correct 107 ms 2032 KB correct
35 Correct 106 ms 2116 KB correct
36 Correct 77 ms 1676 KB correct
37 Correct 20 ms 504 KB correct
38 Correct 108 ms 2232 KB correct
39 Correct 86 ms 1924 KB correct
40 Correct 63 ms 1548 KB correct
41 Correct 14 ms 2040 KB correct
42 Correct 14 ms 2040 KB correct
43 Correct 52 ms 1272 KB correct
44 Correct 45 ms 1016 KB correct
45 Correct 51 ms 1144 KB correct
46 Correct 42 ms 1016 KB correct
47 Correct 25 ms 632 KB correct
48 Correct 8 ms 376 KB correct
49 Correct 16 ms 504 KB correct
50 Correct 27 ms 632 KB correct
51 Correct 54 ms 1144 KB correct
52 Correct 46 ms 1140 KB correct
53 Correct 42 ms 1016 KB correct
54 Correct 53 ms 1404 KB correct
55 Correct 53 ms 1116 KB correct
56 Correct 55 ms 1220 KB correct
57 Correct 54 ms 1144 KB correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 380 KB correct
2 Correct 3 ms 376 KB correct
3 Correct 486 ms 5164 KB correct
4 Correct 932 ms 7640 KB correct
5 Correct 937 ms 7788 KB correct
6 Correct 57 ms 7408 KB correct
7 Correct 235 ms 7460 KB correct
8 Correct 281 ms 7344 KB correct
9 Correct 921 ms 7608 KB correct
10 Correct 938 ms 7900 KB correct
11 Correct 933 ms 7504 KB correct
12 Correct 935 ms 8172 KB correct
13 Correct 2 ms 376 KB correct
14 Correct 531 ms 7488 KB correct
15 Correct 940 ms 8392 KB correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB correct
2 Correct 2 ms 376 KB correct
3 Correct 2 ms 376 KB correct
4 Correct 2 ms 372 KB correct
5 Correct 2 ms 376 KB correct
6 Correct 2 ms 376 KB correct
7 Correct 2 ms 376 KB correct
8 Correct 2 ms 376 KB correct
9 Correct 2 ms 412 KB correct
10 Correct 2 ms 376 KB correct
11 Correct 2 ms 376 KB correct
12 Correct 2 ms 376 KB correct
13 Correct 2 ms 376 KB correct
14 Correct 4 ms 376 KB correct
15 Correct 2 ms 376 KB correct
16 Correct 3 ms 504 KB correct
17 Correct 4 ms 376 KB correct
18 Correct 3 ms 376 KB correct
19 Correct 4 ms 376 KB correct
20 Correct 3 ms 376 KB correct
21 Correct 3 ms 376 KB correct
22 Correct 3 ms 376 KB correct
23 Correct 3 ms 412 KB correct
24 Correct 3 ms 376 KB correct
25 Correct 2 ms 376 KB correct
26 Correct 3 ms 376 KB correct
27 Correct 3 ms 376 KB correct
28 Correct 3 ms 376 KB correct
29 Correct 3 ms 376 KB correct
30 Correct 3 ms 376 KB correct
31 Correct 3 ms 380 KB correct
32 Correct 3 ms 504 KB correct
33 Correct 2 ms 376 KB correct
34 Correct 107 ms 2032 KB correct
35 Correct 106 ms 2116 KB correct
36 Correct 77 ms 1676 KB correct
37 Correct 20 ms 504 KB correct
38 Correct 108 ms 2232 KB correct
39 Correct 86 ms 1924 KB correct
40 Correct 63 ms 1548 KB correct
41 Correct 14 ms 2040 KB correct
42 Correct 14 ms 2040 KB correct
43 Correct 52 ms 1272 KB correct
44 Correct 45 ms 1016 KB correct
45 Correct 51 ms 1144 KB correct
46 Correct 42 ms 1016 KB correct
47 Correct 25 ms 632 KB correct
48 Correct 8 ms 376 KB correct
49 Correct 16 ms 504 KB correct
50 Correct 27 ms 632 KB correct
51 Correct 54 ms 1144 KB correct
52 Correct 46 ms 1140 KB correct
53 Correct 42 ms 1016 KB correct
54 Correct 53 ms 1404 KB correct
55 Correct 53 ms 1116 KB correct
56 Correct 55 ms 1220 KB correct
57 Correct 54 ms 1144 KB correct
58 Correct 2 ms 380 KB correct
59 Correct 3 ms 376 KB correct
60 Correct 486 ms 5164 KB correct
61 Correct 932 ms 7640 KB correct
62 Correct 937 ms 7788 KB correct
63 Correct 57 ms 7408 KB correct
64 Correct 235 ms 7460 KB correct
65 Correct 281 ms 7344 KB correct
66 Correct 921 ms 7608 KB correct
67 Correct 938 ms 7900 KB correct
68 Correct 933 ms 7504 KB correct
69 Correct 935 ms 8172 KB correct
70 Correct 2 ms 376 KB correct
71 Correct 531 ms 7488 KB correct
72 Correct 940 ms 8392 KB correct
73 Correct 2 ms 376 KB correct
74 Correct 952 ms 7716 KB correct
75 Correct 922 ms 7332 KB correct
76 Correct 299 ms 2932 KB correct
77 Correct 936 ms 7624 KB correct
78 Correct 942 ms 7592 KB correct
79 Correct 945 ms 7652 KB correct
80 Correct 925 ms 7484 KB correct
81 Correct 50 ms 6264 KB correct
82 Correct 916 ms 8252 KB correct
83 Correct 524 ms 4316 KB correct
84 Correct 546 ms 4880 KB correct
85 Correct 502 ms 4360 KB correct
86 Correct 351 ms 3160 KB correct
87 Correct 245 ms 2624 KB correct
88 Correct 205 ms 2044 KB correct
89 Correct 196 ms 2068 KB correct
90 Correct 164 ms 1608 KB correct
91 Correct 52 ms 504 KB correct
92 Correct 31 ms 504 KB correct
93 Correct 503 ms 4632 KB correct
94 Correct 352 ms 3148 KB correct
95 Correct 326 ms 3136 KB correct
96 Correct 181 ms 1820 KB correct
97 Correct 214 ms 1988 KB correct
98 Correct 246 ms 2668 KB correct
99 Correct 233 ms 2040 KB correct
100 Correct 77 ms 756 KB correct
101 Correct 29 ms 548 KB correct
102 Correct 494 ms 4272 KB correct
103 Correct 555 ms 4156 KB correct
104 Correct 486 ms 4020 KB correct
105 Correct 493 ms 4280 KB correct