QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#903154 | #8622. London Underground | skip2004 | AC ✓ | 171ms | 8240kb | C++20 | 3.4kb | 2025-02-17 00:29:22 | 2025-02-17 00:29:23 |
Judging History
answer
#include<bits/stdc++.h>
namespace rgs = std::ranges;
using std::cin, std::cout;
using ll = long long;
using u64 = unsigned long long;
using db = double;
const int N = 5000;
const int n = 426;
int m;
std::vector<int> e[N], o;
int used[N];
int max = 0;
void greedy() {
std::vector<int> v, vis(n);
std::vector<int> p(n);
for(int i = 0;i < n;++i) {
p[i] = i;
}
int sum = 0;
for(int i = 0;i < n;++i) {
auto push = [&](int x) {
o.push_back(x);
v.push_back(x);
vis[x] = 1;
};
for(;;) {
if(v.empty()) {
for(int j : p) if(!vis[j]) {
push(j);
break;
}
break;
} else {
int min = 1e9, p = -1;
for(int x : v) {
int deg = 0;
for(int y : e[x]) if(!vis[y]) {
deg += 1;
}
if(deg < min) {
min = deg;
p = x;
}
}
assert(p >= 0);
if(min == 0) {
v.erase(find(v.begin(), v.end(), p));
continue;
}
for(int y : e[p]) if(!vis[y]) {
push(y);
break;
}
break;
}
}
max += 1 << v.size();;
}
// std::cerr << max << '\n';
// std::cerr << o.size() << '\n';
}
int f[1 << 20], g[1 << 20];
std::vector<int> adj[N];
const int mod = 998244353;
void inc(int & x, int y) {
if((x += y) >= mod) {
x -= mod;
}
}
void sub(int & x, int y) {
x -= y;
x += x >> 31 & mod;
}
void solve() {
std::vector<int> id(n);
for(int i = 0;i < n;++i) {
id[o[i]] = i;
}
for(int i = 1;i <= n;++i) {
for(int j = i;j < n;++j) {
for(int k : e[o[j]]) if(id[k] < i) {
adj[i].push_back(k);
}
}
sort(adj[i].begin(), adj[i].end());
adj[i].erase(unique(adj[i].begin(), adj[i].end()), adj[i].end());
}
f[0] = 1;
for(int i = 0;i < n;++i) {
std::vector<int> map(n, -1);
auto new_id = [&](int x) {
auto & t = adj[i + 1];
auto it = find(t.begin(), t.end(), x);
if(it == t.end()) {
return 0;
}
return 1 << int(it - t.begin());
};
std::vector<int> val = adj[i];
for(int & x : val) {
x = new_id(x);
}
int p = o[i];
int tval = new_id(p);
for(int x = 0;x < 1 << adj[i].size();++x) {
for(int j = 0;j < (int) adj[i].size();++j) {
map[adj[i][j]] = x >> j & 1;
}
for(int y = used[p];y < 2;++y) {
int ok = 1;
for(int z : e[p]) if(id[z] < i && y && map[z]) {
ok = 0;
}
if(ok) {
int state = 0;
if(y) state |= tval;
for(int j = 0;j < (int) adj[i].size();++j) {
if(x >> j & 1) {
state |= val[j];
}
}
inc(g[state], f[x]);
}
}
}
for(int j = 0;j < 1 << adj[i + 1].size();++j) {
f[j] = g[j];
g[j] = 0;
}
}
cout << f[0] << '\n';
}
int main() {
#ifdef zqj
freopen("1.in", "r", stdin);
#endif
std::ios::sync_with_stdio(false), cin.tie(0);
cin >> m;
std::vector<std::array<std::string, 2>> o(m);
std::set<std::string> set;
for(auto & [s, t] : o) {
cin >> s >> t;
set.emplace(s);
set.emplace(t);
}
std::vector<std::string> station(set.begin(), set.end());
assert(station.size() == 426);
auto index = [&](std::string x) {
return lower_bound(station.begin(), station.end(), x) - station.begin();
};
for(auto & [s, t] : o) {
int x = index(s);
int y = index(t);
e[x].push_back(y);
e[y].push_back(x);
}
greedy();
int k;
cin >> k;
for(int i = 0;i < k;++i) {
std::string s;
cin >> s;
used[index(s)] = 1;
}
solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 170ms
memory: 5940kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
159589981
result:
ok 1 number(s): "159589981"
Test #2:
score: 0
Accepted
time: 171ms
memory: 6192kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
434129880
result:
ok 1 number(s): "434129880"
Test #3:
score: 0
Accepted
time: 171ms
memory: 6072kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
265208483
result:
ok 1 number(s): "265208483"
Test #4:
score: 0
Accepted
time: 160ms
memory: 6060kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
0
result:
ok 1 number(s): "0"
Test #5:
score: 0
Accepted
time: 63ms
memory: 6312kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
0
result:
ok 1 number(s): "0"
Test #6:
score: 0
Accepted
time: 142ms
memory: 6064kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
538295197
result:
ok 1 number(s): "538295197"
Test #7:
score: 0
Accepted
time: 123ms
memory: 6184kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
0
result:
ok 1 number(s): "0"
Test #8:
score: 0
Accepted
time: 171ms
memory: 8240kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
336817147
result:
ok 1 number(s): "336817147"
Test #9:
score: 0
Accepted
time: 168ms
memory: 6144kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
400446333
result:
ok 1 number(s): "400446333"
Test #10:
score: 0
Accepted
time: 168ms
memory: 6192kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
976542866
result:
ok 1 number(s): "976542866"
Test #11:
score: 0
Accepted
time: 140ms
memory: 6320kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
602812360
result:
ok 1 number(s): "602812360"
Test #12:
score: 0
Accepted
time: 128ms
memory: 6188kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
8
result:
ok 1 number(s): "8"
Test #13:
score: 0
Accepted
time: 127ms
memory: 6316kb
input:
505 Baker_Street Regents_Park Charing_Cross Embankment Edgware_Road__Bakerloo_ Marylebone Embankment Waterloo Harlesden Willesden_Junction Harrow_and_Wealdstone Kenton Kensal_Green Queens_Park Kenton South_Kenton Kilburn_Park Maida_Vale Lambeth_North Elephant_and_Castle Maida_Vale Warwick_Avenue Mar...
output:
1
result:
ok 1 number(s): "1"
Extra Test:
score: 0
Extra Test Passed