QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#572769 | #7940. Impossible Numbers | HuTao | WA | 1ms | 6492kb | C++14 | 3.2kb | 2024-09-18 16:18:39 | 2024-09-18 16:18:39 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, M = 105, T = 2e7 + 5, m = 10;
struct BigNumber{
int n, pos;
char s[M];
inline void Write()
{
reverse(s, s + n);
for(int i = 0; i < n; i ++ ) s[i] ^= 48;
printf("%s ", s);
reverse(s, s + n);
for(int i = 0; i < n; i ++ ) s[i] ^= 48;
}
inline void Make(BigNumber &t, int i, int x)
{
for(int j = 0; j < i; j ++ ) s[j] = t.s[j];
s[i] = x;
for(int j = i; j < t.n; j ++ ) s[j + 1] = t.s[j];
n = t.n + 1, pos = i + 1;
}
inline bool operator <= (const BigNumber &w) const
{
if(n != w.n) return n < w.n;
for(int i = n - 1; i >= 0; i -- )
if(s[i] != w.s[i])
return s[i] < w.s[i];
return 1;
}
inline bool operator != (const BigNumber &w) const
{
if(n != w.n) return 1;
for(int i = 0; i < n; i ++ )
if(s[i] != w.s[i])
return 1;
return 0;
}
};
bool ST;
int n, k;
bitset<M> vis[m];
int f[N], st[N];
BigNumber s[N], r[N], cur;
int p0, p1, c1;
struct Node{
unsigned t : 18;
unsigned i : 8;
unsigned x : 4;
}x[T], y[T];
int cnt[N];
bool ED;
inline int GetBit(Node &x, int i)
{
return i < x.i ? s[x.t].s[i] : (i == x.i ? x.x : s[x.t].s[i - 1]);
}
inline int GetBlock(Node &x, int i)
{
return ((((GetBit(x, i + 4) * 10 + GetBit(x, i + 3)) * 10) + GetBit(x, i + 2)) * 10 + GetBit(x, i + 1)) * 10 + GetBit(x, i);
}
inline void Sort(int n, int m)
{
if(!m) return ;
int c = 0;
for(int i = 0; i < m; i ++ )
for(int j = s[i].pos; j < n; j ++ )
for(int k = (j == n - 1); k < 10; k ++ )
if(!j || s[i].s[j - 1] != k)
c ++ , x[c].t = i, x[c].i = j, x[c].x = k;
// puts("");
// for(int i = 0; i < c; i ++ )
// {
// cur.Make(s[x[i].t], x[i].i, x[i].x);
// cur.Write();
// }
// exit(0);
Node *p = x, *q = y;
for(int i = 0; i < n; i += 5)
{
for(int j = 0; j < c; j ++ ) cnt[GetBlock(p[j], i)] ++ ;
for(int j = 1; j < N; j ++ ) cnt[j] += cnt[j - 1];
for(int j = c - 1; j >= 0; j -- ) q[ -- cnt[GetBlock(p[j], i)]] = p[j];
for(int j = 0; j < N; j ++ ) cnt[j] = 0;
swap(p, q);
}
r[0].Make(s[p[0].t], p[0].i, p[0].x), c1 = 1;
for(int i = 1; i < c; i ++ )
{
cur.Make(s[p[i].t], p[i].i, p[i].x);
if(cur != r[c1 - 1]) r[c1 ++ ] = cur;
if(c1 >= k) break;
}
}
inline void DFS(int i, int ty, int S)
{
if(!st[S] || p0 == k) return ;
if(i < 0)
{
while(p1 < c1 && p0 < k && r[p1] <= cur) s[p0 ++ ] = r[p1 ++ ];
if(p0 < k && s[p0 - 1] != cur) s[p0 ++ ] = cur;
return ;
}
for(int j = ty; j < m; j ++ )
{
cur.s[i] = j;
DFS(i - 1, 0, S | (1 << j));
}
}
int main()
{
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i ++ )
for(int j = 0; j < 6; j ++ )
{
int x;
scanf("%d", &x);
vis[x].set(i);
}
for(int i = 0; i < 1 << m; i ++ )
{
bitset<M> mask;
for(int j = 0; j < m; j ++ )
if(i >> j & 1)
mask |= vis[j];
f[i] = mask.count() + 1;
}
for(int i = 1; k; i ++ )
{
Sort(i, p0);
for(int j = (1 << m) - 1; j >= 0; j -- )
{
st[j] |= f[j] <= i;
for(int k = 0; k < m; k ++ )
st[j] |= st[j | 1 << k];
}
p0 = p1 = 0;
cur.n = i, cur.pos = 0;
DFS(i - 1, 1, 0);
for(int i = 0; i < p0; i ++ ) s[i].Write();
k -= p0;
}
puts("");
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3872kb
input:
2 3 1 8 7 0 6 2 1 2 5 4 9 3
output:
33 34 35
result:
ok single line: '33 34 35 '
Test #2:
score: 0
Accepted
time: 1ms
memory: 4112kb
input:
1 10 1 5 2 2 6 4
output:
3 7 8 9 10 11 12 13 14 15
result:
ok single line: '3 7 8 9 10 11 12 13 14 15 '
Test #3:
score: 0
Accepted
time: 1ms
memory: 4456kb
input:
4 10 1 5 7 1 2 4 0 1 5 8 9 4 3 5 2 2 7 8 6 1 7 0 2 2
output:
33 66 99 133 166 199 233 266 299 303
result:
ok single line: '33 66 99 133 166 199 233 266 299 303 '
Test #4:
score: 0
Accepted
time: 1ms
memory: 4112kb
input:
5 10 5 9 4 8 3 3 1 1 9 2 8 9 6 3 3 0 2 1 2 6 0 3 6 4 3 6 4 2 9 4
output:
7 17 27 37 47 55 57 67 70 71
result:
ok single line: '7 17 27 37 47 55 57 67 70 71 '
Test #5:
score: 0
Accepted
time: 0ms
memory: 4184kb
input:
5 10 8 7 1 4 8 9 2 5 0 1 0 1 9 5 5 3 9 7 6 0 0 2 3 1 1 0 0 4 9 3
output:
66 88 166 188 222 226 262 266 288 366
result:
ok single line: '66 88 166 188 222 226 262 266 288 366 '
Test #6:
score: -100
Wrong Answer
time: 1ms
memory: 6492kb
input:
5 10 6 8 7 7 0 0 0 5 1 9 4 1 5 9 6 9 5 4 0 4 6 9 1 6 2 8 7 4 4 0
output:
3 13 22 23 30 31 32 33 111 113
result:
wrong answer 1st lines differ - expected: '3 13 22 23 30 31 32 33 34 35', found: '3 13 22 23 30 31 32 33 111 113 '