QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#903154#8622. London Undergroundskip2004AC ✓171ms8240kbC++203.4kb2025-02-17 00:29:222025-02-17 00:29:23

Judging History

This is the latest submission verdict.

  • [2025-02-17 00:29:23]
  • Judged
  • Verdict: AC
  • Time: 171ms
  • Memory: 8240kb
  • [2025-02-17 00:29:22]
  • Submitted

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