QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#187528 | #3848. Building on the Moon | ucup-team1209# | AC ✓ | 9ms | 7680kb | C++17 | 6.6kb | 2023-09-24 17:56:38 | 2023-09-24 17:56:38 |
Judging History
answer
#include<bits/stdc++.h>
using db = double;
using std::cin;
using std::cout;
using cp = std::complex<db>;
using ll = long long;
using pi = std :: pair <int, int> ;
using u64 = unsigned long long;
const int mod = 1e6 + 3;
const int N = 1000005;
bool cmn(int & x, int y) {
if(x > y) return x = y, 1;
return 0;
}
int n, L;
pi dp[4][105][4], way[4][4];
int e[20];
pi operator + (pi a, int b) {
return {a.first + b, a.second};
}
pi operator * (const pi & a, const pi & b) {
return {a.first + b.first, (u64) a.second * b.second % mod };
}
void add(int & x, int y) {
if((x += y) >= mod) {
x -= mod;
}
}
pi& operator += (pi & a, const pi & b) {
if(b.first > a.first) {
return a = b;
} else if(b.first == a.first) {
return add(a.second, b.second), a;
} else {
return a;
}
}
void trans(pi & a, pi b) {
if(b.first > a.first) {
a = b;
}
else if(b.first == a.first) {
a.second = (a.second + b.second) % mod;
}
}
int count(int S) {
if (S==63) return 3;
while (S&1) S|=1<<6,S>>=1;
int res=0;
while (S) {
while (!(S&1)) S>>=1;
int c=0;
while (S&1) S>>=1,++c;
if (c&1) return -1;
res+=c/2;
}
return res;
}
void work(int S, pi dp[105][4]) {
for(int i = 0; i <= L; i++)
for(int j = 0; j < 4; j++) dp[i][j] = {-100, 0};
dp[0][S] = {0, 1};
if(!S) dp[0][3] = {1, 1};
// cout << count(62) << ' ' << count(15) << ' ' << count(30) << '\n';
for(int i = 1; i <= L; i++) {
for(int a = 0; a < 4; a++) {
for(int x = 0; x < 64; x++) {
int c = count(x);
if(x % 4 == 3) {
int t = count(x ^ 3);
if(x == 63 || t == -1 || t + 1 != c) {
} else {
continue;
}
}
if((x & a) == 0 && c != -1) {
trans(dp[i][(x >> 4 & 1) | ((x >> 3 & 1) << 1)], dp[i - 1][a] * pi(c, 1));
// cout << "Trans ------- " << i- 1 <<' ' << a << ' ' << x << ' ' << c << '\n';
}
}
}
// for(int a= 0; a < 4; a++) cout << dp[i][a].first <<' ';cout<<'\n';
// for(int a= 0; a < 4; a++) cout << dp[i][a].second <<' ';cout<<'\n';
}
for(int T = 0; T < 4; T++)
for(int o = 0; o < 4; o++)
if((o & T) == 0) trans(way[S][T], dp[L][o]);
}
int cut(int S) {
int c = 0;
for(int i = 0; i < n; i++) {
if(!(S >> i & 1)) c += __builtin_popcount(S & e[i]);
// cout << i << ' ' << e[i] << '\n';
}
return c;
}
std :: vector <int> getseq() {
std :: vector <int> dp(1 << n, 1e9), tr(1 << n);
for(int i = 0; i < n; i++) dp[1 << i] = 0, tr[1 << i] = i;
for(int S = 1; S < (1 << n); S++) {
dp[S] = std :: max(dp[S], cut(S));
// cout << S << ' ' << dp[S] << '\n';
for(int i = 0; i < n; i++)
if(!(S >> i & 1)) {
int T = S | (1 << i);
if(cmn(dp[T], dp[S]))
dp[T] = dp[S], tr[T] = i;
}
}
std :: vector <int> seq;
int cur = (1 << n) - 1;
while(cur) {
int x = tr[cur];
seq.push_back(x);
cur ^= 1 << x;
}
reverse(seq.begin(), seq.end());
// cout << dp[(1 << n) - 1] << '\n';
return seq;
}
pi get(int a, int b, int c, int d) {
return way[d + c * 2][a + b * 2];
}
std::array<int, 3> edge[N];
std::array<std::pair<int, int>, 3> edge_id[N];
int main() {
#ifdef zqj
freopen("1.in","r",stdin);
#endif
std::ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> L;
for(int S = 0; S < 4; S++) work(S, dp[S]);
/*
for(int a : {0, 1})
for(int b : {0, 1})
for(int c : {0, 1})
for(int d : {0, 1})
assert(get(a, b, c, d) == get(d, c, b, a));
cout << get(0, 0, 0, 0).first << '\n';
cout << get(0, 0, 0, 0).second << '\n';
//return 0;
*/
for(int i = 0; i < n; i++) {
int a, b, c;
cin >> a >> b >> c;
edge[i][0] = a - 1;
edge[i][1] = b - 1;
edge[i][2] = c - 1;
e[i] |= 1 << (a - 1);
e[i] |= 1 << (b - 1);
e[i] |= 1 << (c - 1);
}
for(int i = 0;i < n;++i) {
for(int x = 0;x < 3;++x) {
int t = edge[i][x];
int y = std::find(edge[t].begin(), edge[t].end(), i) - edge[t].begin();
assert(y != 3);
edge_id[i][x] = {t * 6 + y * 2, t * 6 + y * 2 + 1};
}
}
std :: vector <int> seq = getseq();
std::vector<int> states;
for(int i = 0;i < 1 << 6;++i) {
int cnt[6] = {};
for(int j = 0;j < 6;++j) if(i >> j & 1) {
cnt[j] += 1;
cnt[(j + 1) % 6] += 1;
}
int bad = 0, s = 0;
for(int j = 0;j < 6;j += 2) if(i >> j & 1) {
bad = 1;
}
for(int j = 0;j < 6;++j) {
if(cnt[j] >= 2) {
bad = 1;
}
if(cnt[j] > 0) {
s |= 1 << j;
}
}
if(!bad) states.emplace_back(s);
}
int S = 0, T = (1 << n) - 1;
std::vector<pi> dp(1, {0, 1});
std::vector<int> in(n, 1);
std::vector<int> index(6 * n, -1), cuts;
for(int i = 0;i < n;++i) {
std::vector<int> new_index(6 * n, -1), new_cuts;
int cut_size = 0;
int x = seq[i];
S ^= 1 << x;
T ^= 1 << x;
in[x] = 0;
for(int i = 0;i < n;++i) if(S >> i & 1) {
cut_size += __builtin_popcount(e[i] & T);
}
int cnt = 0;
for(int i = 0;i < n;++i) if(T >> i & 1) {
for(int j = 0;j < 3;++j) {
int go = edge[i][j];
if(S >> go & 1) {
new_index[edge_id[i][j].first] = cnt++;
new_index[edge_id[i][j].second] = cnt++;
new_cuts.push_back(edge_id[i][j].first);
new_cuts.push_back(edge_id[i][j].second);
}
}
}
std::vector<pi> g(1 << (cut_size * 2), {-100, 1});
assert(cut_size * 2 == new_cuts.size());
assert(dp.size() == 1 << cuts.size());
for(int i = 0;i < (int) dp.size();++i) if(dp[i].first >= 0) {
for(int s : states) {
pi z(__builtin_popcount(s) / 2, 1);
for(int j = 0;j < 3;++j) {
int go = edge[x][j];
if(S >> go & 1) {
auto [a, b] = edge_id[x][j];
assert(index[a] >= 0);
assert(index[b] >= 0);
z = z * get(s >> (j * 2) & 1, s >> (j * 2 + 1) & 1, i >> index[a] & 1, i >> index[b] & 1); // TODO
}
}
int new_s = 0;
for(int x = 0;x < (int) cuts.size();++x) {
if((i >> x & 1) && new_index[cuts[x]] >= 0) {
// asseert(new_index[cuts[x]] >= 0);
new_s |= 1 << new_index[cuts[x]];
}
}
for(int j = 0;j < 6;++j) if(new_index[j + x * 6] >= 0 && (s >> j & 1)) {
new_s |= 1 << new_index[j + x * 6];
}
g[new_s] += dp[i] * z;
}
}
dp = g;
index = new_index;
cuts = new_cuts;
}
// cout << dp[0].first << '\n';
cout << dp[0].second << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5544kb
input:
4 1 2 3 4 1 4 3 1 2 4 1 3 2
output:
108
result:
ok single line: '108'
Test #2:
score: 0
Accepted
time: 0ms
memory: 5528kb
input:
4 20 2 3 4 1 4 3 1 2 4 1 3 2
output:
804233
result:
ok single line: '804233'
Test #3:
score: 0
Accepted
time: 0ms
memory: 5588kb
input:
4 100 2 3 4 1 4 3 1 2 4 1 3 2
output:
117845
result:
ok single line: '117845'
Test #4:
score: 0
Accepted
time: 2ms
memory: 5568kb
input:
8 52 4 5 2 1 6 3 2 7 4 3 8 1 8 6 1 5 7 2 6 8 3 7 5 4
output:
986302
result:
ok single line: '986302'
Test #5:
score: 0
Accepted
time: 2ms
memory: 5532kb
input:
8 99 4 5 2 1 6 3 2 7 4 3 8 1 8 6 1 5 7 2 6 8 3 7 5 4
output:
25
result:
ok single line: '25'
Test #6:
score: 0
Accepted
time: 4ms
memory: 5736kb
input:
14 43 7 8 2 1 9 3 2 10 4 3 11 5 4 12 6 5 13 7 6 14 1 14 9 1 8 10 2 9 11 3 10 12 4 11 13 5 12 14 6 13 8 7
output:
426592
result:
ok single line: '426592'
Test #7:
score: 0
Accepted
time: 4ms
memory: 5668kb
input:
14 77 7 8 2 1 9 3 2 10 4 3 11 5 4 12 6 5 13 7 6 14 1 14 9 1 8 10 2 9 11 3 10 12 4 11 13 5 12 14 6 13 8 7
output:
267434
result:
ok single line: '267434'
Test #8:
score: 0
Accepted
time: 3ms
memory: 5640kb
input:
14 23 2 3 4 1 5 3 1 2 6 1 6 7 2 8 9 3 10 4 4 11 12 5 13 9 5 8 10 6 9 14 7 14 12 7 11 13 8 12 14 10 13 11
output:
843062
result:
ok single line: '843062'
Test #9:
score: 0
Accepted
time: 3ms
memory: 5672kb
input:
14 87 2 3 4 1 5 3 1 2 6 1 6 7 2 8 9 3 10 4 4 11 12 5 13 9 5 8 10 6 9 14 7 14 12 7 11 13 8 12 14 10 13 11
output:
315869
result:
ok single line: '315869'
Test #10:
score: 0
Accepted
time: 3ms
memory: 5636kb
input:
14 46 2 3 4 1 5 3 1 2 6 1 6 7 2 8 9 3 10 4 4 11 12 5 13 9 5 8 10 6 9 14 7 14 12 7 11 13 8 12 14 10 13 11
output:
424598
result:
ok single line: '424598'
Test #11:
score: 0
Accepted
time: 0ms
memory: 5708kb
input:
14 24 2 3 4 1 5 6 1 7 8 1 9 10 2 11 12 2 13 14 3 14 12 3 11 9 4 8 10 4 9 11 5 10 8 5 7 13 6 12 14 6 13 7
output:
426600
result:
ok single line: '426600'
Test #12:
score: 0
Accepted
time: 3ms
memory: 5636kb
input:
14 59 2 3 4 1 5 6 1 7 8 1 9 10 2 11 12 2 13 14 3 14 12 3 11 9 4 8 10 4 9 11 5 10 8 5 7 13 6 12 14 6 13 7
output:
174886
result:
ok single line: '174886'
Test #13:
score: 0
Accepted
time: 3ms
memory: 5624kb
input:
14 92 2 3 4 1 5 6 1 7 8 1 9 10 2 11 12 2 13 14 3 14 12 3 11 9 4 8 10 4 9 11 5 10 8 5 7 13 6 12 14 6 13 7
output:
651944
result:
ok single line: '651944'
Test #14:
score: 0
Accepted
time: 3ms
memory: 5660kb
input:
14 89 2 3 4 1 5 6 1 7 8 1 9 10 2 11 6 2 5 7 3 6 8 3 7 12 4 13 10 4 9 11 5 10 14 8 14 13 9 12 14 11 13 12
output:
6992
result:
ok single line: '6992'
Test #15:
score: 0
Accepted
time: 3ms
memory: 5660kb
input:
14 37 2 3 4 1 5 6 1 7 8 1 9 10 2 11 6 2 5 7 3 6 8 3 7 12 4 13 10 4 9 11 5 10 14 8 14 13 9 12 14 11 13 12
output:
375845
result:
ok single line: '375845'
Test #16:
score: 0
Accepted
time: 3ms
memory: 5636kb
input:
14 76 2 3 4 1 5 6 1 7 8 1 9 10 2 11 6 2 5 7 3 6 8 3 7 12 4 13 10 4 9 11 5 10 14 8 14 13 9 12 14 11 13 12
output:
931940
result:
ok single line: '931940'
Test #17:
score: 0
Accepted
time: 3ms
memory: 5672kb
input:
14 77 2 3 4 1 5 6 1 7 8 1 9 5 2 4 10 2 11 7 3 6 11 3 12 9 4 8 13 5 14 11 6 10 7 8 14 13 9 12 14 10 13 12
output:
648150
result:
ok single line: '648150'
Test #18:
score: 0
Accepted
time: 3ms
memory: 5716kb
input:
14 60 2 3 4 1 5 6 1 7 8 1 9 5 2 4 10 2 11 7 3 6 11 3 12 9 4 8 13 5 14 11 6 10 7 8 14 13 9 12 14 10 13 12
output:
156164
result:
ok single line: '156164'
Test #19:
score: 0
Accepted
time: 0ms
memory: 5636kb
input:
14 1 2 3 4 1 5 6 1 7 8 1 9 5 2 4 10 2 11 7 3 6 11 3 12 9 4 8 13 5 14 11 6 10 7 8 14 13 9 12 14 10 13 12
output:
188581
result:
ok single line: '188581'
Test #20:
score: 0
Accepted
time: 8ms
memory: 5664kb
input:
16 1 2 3 4 1 6 5 1 9 12 1 13 16 2 7 8 8 7 2 8 5 6 5 7 6 10 11 3 9 12 11 9 10 12 3 11 10 14 15 4 16 15 13 13 14 16 4 15 14
output:
895932
result:
ok single line: '895932'
Test #21:
score: 0
Accepted
time: 4ms
memory: 5584kb
input:
16 71 2 3 4 1 6 5 1 9 12 1 13 16 2 7 8 8 7 2 8 5 6 5 7 6 10 11 3 9 12 11 9 10 12 3 11 10 14 15 4 16 15 13 13 14 16 4 15 14
output:
507594
result:
ok single line: '507594'
Test #22:
score: 0
Accepted
time: 8ms
memory: 5612kb
input:
16 97 2 3 4 1 6 5 1 9 12 1 13 16 2 7 8 8 7 2 8 5 6 5 7 6 10 11 3 9 12 11 9 10 12 3 11 10 14 15 4 16 15 13 13 14 16 4 15 14
output:
400279
result:
ok single line: '400279'
Test #23:
score: 0
Accepted
time: 8ms
memory: 5652kb
input:
16 53 2 3 4 1 5 3 1 2 6 1 7 8 2 9 10 3 11 12 4 12 8 4 7 13 5 14 10 5 9 15 6 15 16 6 13 7 8 12 14 9 13 16 10 16 11 11 15 14
output:
648787
result:
ok single line: '648787'
Test #24:
score: 0
Accepted
time: 4ms
memory: 5604kb
input:
16 59 2 3 4 1 5 6 1 7 4 1 3 8 2 9 10 2 10 11 3 12 13 4 14 15 5 15 16 5 11 6 6 10 12 7 11 13 7 12 16 8 16 15 8 14 9 9 14 13
output:
169286
result:
ok single line: '169286'
Test #25:
score: 0
Accepted
time: 8ms
memory: 5628kb
input:
16 7 2 3 4 1 5 6 1 6 7 1 8 9 2 10 11 2 11 3 3 12 13 4 14 9 4 8 10 5 9 15 5 15 6 7 16 13 7 12 14 8 13 16 10 16 11 12 15 14
output:
511775
result:
ok single line: '511775'
Test #26:
score: 0
Accepted
time: 6ms
memory: 7680kb
input:
16 67 2 3 4 1 5 6 1 6 7 1 7 8 2 8 9 2 10 3 3 11 4 4 9 5 5 8 12 6 13 14 7 14 12 9 11 15 10 15 16 10 16 11 12 16 13 13 15 14
output:
853521
result:
ok single line: '853521'
Test #27:
score: 0
Accepted
time: 9ms
memory: 5676kb
input:
16 71 2 3 4 1 5 6 1 7 8 1 9 10 2 10 11 2 12 7 3 6 8 3 7 13 4 14 10 4 9 5 5 15 12 6 11 15 8 16 14 9 13 16 11 16 12 13 15 14
output:
227334
result:
ok single line: '227334'