# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
446632 |
2021-07-22T21:37:14 Z |
crackersamdjam |
Keys (IOI21_keys) |
C++17 |
|
1548 ms |
2097156 KB |
#include "keys.h"
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#ifdef LOCAL
template<typename T> void pr(T a){std::cerr<<a<<std::endl;}
template<typename T, typename... Args> void pr(T a, Args... args){std::cerr<<a<<' ',pr(args...);}
#else
template<typename... Args> void pr(Args... args){}
#endif
using namespace std;
using pii = pair<int, int>;
int constexpr MM = 3e5+5;
int n, m;
vector<int> r;
vector<int> adj[MM];
vector<int> adj2[MM];
int dfn[MM], low[MM], t, id[MM];
bool ins[MM];
stack<int> stk;
vector<int> scc[MM];
set<int> newkeys[MM], donekeys[MM];
map<int, vector<int>> to[MM];
// which weakly connected component
// this is different from id[], which is scc "root"
int par[MM];
int find(int x){
while(x != par[x])
x = par[x], par[x] = par[par[x]];
return x;
}
void merge(int a, int b){
// merges b into a
if(size(newkeys[b]) > size(newkeys[a]))
swap(newkeys[a], newkeys[b]);
for(auto i: newkeys[b])
newkeys[a].insert(i);
if(size(donekeys[b]) > size(donekeys[a]))
swap(donekeys[a], donekeys[b]);
for(auto i: donekeys[b])
donekeys[a].insert(i);
if(size(to[a]) > size(to[b]))
swap(to[a], to[b]);
for(auto &[i, v]: to[b]){
to[a][i].insert(to[a][i].end(), all(v));
}
if(size(scc[a]) > size(scc[b]))
swap(scc[a], scc[b]);
scc[a].insert(scc[a].end(), all(scc[b]));
par[find(b)] = find(a);
}
void dfs(int cur){
dfn[cur] = low[cur] = ++t;
stk.push(cur);
ins[cur] = 1;
for(auto u: adj[cur]){
if(!dfn[u]){
dfs(u);
low[cur] = min(low[cur], low[u]);
}
else if(ins[u])
low[cur] = min(low[cur], dfn[u]);
}
if(dfn[cur] == low[cur]){
int u = -1;
while(u != cur){
u = stk.top(); stk.pop();
ins[u] = 0;
id[u] = cur;
merge(cur, u);
}
}
}
vector<int> find_reachable(vector<int> _r, vector<int> a, vector<int> b, vector<int> c){
r = move(_r);
n = size(r);
m = size(a);
vector<int> res(n);
for(int i = 0; i < m; i++){
if(c[i] == r[a[i]]){
adj[a[i]].emplace_back(b[i]);
// pr("edge", a[i], b[i]);
}
else{
to[a[i]][c[i]].emplace_back(b[i]);
}
if(c[i] == r[b[i]]){
adj[b[i]].emplace_back(a[i]);
// pr("edge", a[i], b[i]);
}
else{
to[b[i]][c[i]].emplace_back(a[i]);
}
}
for(int i = 0; i < n; i++){
par[i] = i;
newkeys[i].insert(r[i]);
scc[i].emplace_back(i);
}
for(int i = 0; i < n; i++){
if(!dfn[i]){
dfs(i);
}
}
for(int i = 0; i < n; i++){
for(int j: adj[i]){
if(id[i] != id[j]){
adj2[id[i]].emplace_back(id[j]);
}
}
}
// each scc root...
vector<int> roots;
for(int i = 0; i < n; i++){
if(!size(adj2[i])){
roots.emplace_back(i);
pr("add rt", i);
}
}
for(auto rt: roots){
while(size(newkeys[rt])){
auto i = *newkeys[rt].begin();
newkeys[rt].erase(i);
if(donekeys[rt].count(i)) continue;
donekeys[rt].insert(i);
for(auto u: to[rt][i]){
if(find(u) == find(rt)){
merge(rt, u);
}
else{
merge(u, rt);
break;
}
}
}
}
int ans = 1e9;
for(auto rt : roots){
if(find(rt) == rt){
int s = size(scc[rt]);
pr("check sz", rt, s);
if(s < ans){
ans = s;
}
}
}
for(auto rt : roots){
if(find(rt) == rt){
int s = size(scc[rt]);
if(s == ans){
pr("scc", rt);
for(auto j: scc[rt]){
pr("j", j);
res[j] = 1;
}
}
}
}
return res;
}
#ifdef LOCAL
namespace me{
void go(){
int n, m;
cin>>n>>m;
vector<int> r(n), a(m), b(m), c(m);
for(int i = 0; i < n; i++)
cin>>r[i];
for(int i = 0; i < m; i++){
cin>>a[i]>>b[i]>>c[i];
}
auto res = find_reachable(r, a, b, c);
for(int i = 0; i < size(res); i++)
cout<<res[i]<<' ';
}
}
int main(){
me::go();
}
#endif
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
63716 KB |
Output is correct |
2 |
Correct |
35 ms |
63660 KB |
Output is correct |
3 |
Correct |
35 ms |
63648 KB |
Output is correct |
4 |
Correct |
35 ms |
63716 KB |
Output is correct |
5 |
Correct |
35 ms |
63720 KB |
Output is correct |
6 |
Correct |
35 ms |
63732 KB |
Output is correct |
7 |
Correct |
35 ms |
63692 KB |
Output is correct |
8 |
Correct |
35 ms |
63728 KB |
Output is correct |
9 |
Correct |
35 ms |
63692 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
63716 KB |
Output is correct |
2 |
Correct |
35 ms |
63660 KB |
Output is correct |
3 |
Correct |
35 ms |
63648 KB |
Output is correct |
4 |
Correct |
35 ms |
63716 KB |
Output is correct |
5 |
Correct |
35 ms |
63720 KB |
Output is correct |
6 |
Correct |
35 ms |
63732 KB |
Output is correct |
7 |
Correct |
35 ms |
63692 KB |
Output is correct |
8 |
Correct |
35 ms |
63728 KB |
Output is correct |
9 |
Correct |
35 ms |
63692 KB |
Output is correct |
10 |
Correct |
35 ms |
63692 KB |
Output is correct |
11 |
Correct |
35 ms |
63684 KB |
Output is correct |
12 |
Correct |
38 ms |
63692 KB |
Output is correct |
13 |
Correct |
35 ms |
63676 KB |
Output is correct |
14 |
Correct |
35 ms |
63732 KB |
Output is correct |
15 |
Runtime error |
1548 ms |
2097156 KB |
Execution killed with signal 9 |
16 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
63716 KB |
Output is correct |
2 |
Correct |
35 ms |
63660 KB |
Output is correct |
3 |
Correct |
35 ms |
63648 KB |
Output is correct |
4 |
Correct |
35 ms |
63716 KB |
Output is correct |
5 |
Correct |
35 ms |
63720 KB |
Output is correct |
6 |
Correct |
35 ms |
63732 KB |
Output is correct |
7 |
Correct |
35 ms |
63692 KB |
Output is correct |
8 |
Correct |
35 ms |
63728 KB |
Output is correct |
9 |
Correct |
35 ms |
63692 KB |
Output is correct |
10 |
Correct |
35 ms |
63692 KB |
Output is correct |
11 |
Correct |
35 ms |
63684 KB |
Output is correct |
12 |
Correct |
38 ms |
63692 KB |
Output is correct |
13 |
Correct |
35 ms |
63676 KB |
Output is correct |
14 |
Correct |
35 ms |
63732 KB |
Output is correct |
15 |
Runtime error |
1548 ms |
2097156 KB |
Execution killed with signal 9 |
16 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
63716 KB |
Output is correct |
2 |
Correct |
35 ms |
63660 KB |
Output is correct |
3 |
Correct |
35 ms |
63648 KB |
Output is correct |
4 |
Correct |
35 ms |
63716 KB |
Output is correct |
5 |
Correct |
35 ms |
63720 KB |
Output is correct |
6 |
Correct |
35 ms |
63732 KB |
Output is correct |
7 |
Correct |
35 ms |
63692 KB |
Output is correct |
8 |
Correct |
35 ms |
63728 KB |
Output is correct |
9 |
Correct |
35 ms |
63692 KB |
Output is correct |
10 |
Correct |
672 ms |
140712 KB |
Output is correct |
11 |
Runtime error |
546 ms |
337736 KB |
Execution killed with signal 11 |
12 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
63716 KB |
Output is correct |
2 |
Correct |
35 ms |
63660 KB |
Output is correct |
3 |
Correct |
35 ms |
63648 KB |
Output is correct |
4 |
Correct |
35 ms |
63716 KB |
Output is correct |
5 |
Correct |
35 ms |
63720 KB |
Output is correct |
6 |
Correct |
35 ms |
63732 KB |
Output is correct |
7 |
Correct |
35 ms |
63692 KB |
Output is correct |
8 |
Correct |
35 ms |
63728 KB |
Output is correct |
9 |
Correct |
35 ms |
63692 KB |
Output is correct |
10 |
Correct |
35 ms |
63692 KB |
Output is correct |
11 |
Correct |
35 ms |
63684 KB |
Output is correct |
12 |
Correct |
38 ms |
63692 KB |
Output is correct |
13 |
Correct |
35 ms |
63676 KB |
Output is correct |
14 |
Correct |
35 ms |
63732 KB |
Output is correct |
15 |
Runtime error |
1548 ms |
2097156 KB |
Execution killed with signal 9 |
16 |
Halted |
0 ms |
0 KB |
- |