QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#388754 | #8005. Crossing the Border | RedreamMer | WA | 96ms | 139536kb | C++17 | 3.2kb | 2024-04-13 19:18:10 | 2024-04-13 19:18:11 |
Judging History
answer
// #pragma GCC optimize("O3")
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define PB emplace_back
#define int long long
#define ll long long
#define vi vector<int>
#define siz(a) ((int) ((a).size()))
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
void print(vi n) { rep(i, 0, siz(n) - 1) cerr << n[i] << " \n"[i == siz(n) - 1]; }
const int N = 22, mod = 998244353, inf = 1e12;
int a, b, s[1 << N], w[1 << N], now[1 << N];
struct pii {
int x, y;
pii (int _x = inf, int _y = 0) {x = _x, y = _y;}
pii operator+(const int &o) const {return pii(x + o, y);}
pii operator+(const pii &o) const {
if(x < o.x) return pii(x, y);
else if(x > o.x) return o;
return pii(x, (y + o.y) % mod);
}
} f[1 << N], c[N], val[1 << N];
vector<pii> q, p[1 << (N >> 1)];
signed main() {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> a >> b;
rep(i, 0, a - 1) cin >> c[i].x >> c[i].y;
sort(c, c + a, [&] (pii x, pii y) {
return x.y < y.y;
});
rep(i, 0, a - 1) s[1 << i] = c[i].x, w[1 << i] = c[i].y;
rep(i, 1, (1 << a) - 1) {
int j = i & -i;
if(i != j) s[i] = s[i ^ j] + s[j], w[i] = w[i ^ j];
}
int d = a / 2, e = a - d;
f[0] = pii {0, 1};
rep(i, 1, (1 << a) - 1) {
int st = i & ((1 << d) - 1);
for(int j = st; j; j = (j - 1) & st) if(s[j] <= b && (st & -st) == (j & -j))
f[i] = f[i] + (f[i ^ j] + w[j]);
}
rep(i, 1, (1 << a) - 1) {
int st = i >> d;
for(int j = st; j; j = (j - 1) & st) if(s[j << d] <= b && (st & -st) == (j & -j))
f[i] = f[i] + (f[i ^ (j << d)] + w[j << d]);
}
// cout << f[3].x << endl;
rep(i, 0, (1 << d) - 1) {
for(int j = i; j; j = (j - 1) & i) p[i].PB(pii(j, s[j]));
sort(p[i].begin(), p[i].end(), [&] (pii x, pii y) {
return x.y < y.y;
});
}
// if(a >= 18) {
// cout << f[(1 << a) - 1].x << ' ' << f[(1 << a) - 1].y;
// return 0;
// }
rep(i, 0, (1 << e) - 1) {
q.clear();
int st = i ^ ((1 << e) - 1);
for(int j = st; j; j = (j - 1) & st) if((st & -st) == (j & -j)) q.PB(pii(j, s[j << d]));
sort(q.begin(), q.end(), [&] (pii x, pii y) {
return x.y > y.y;
});
rep(j, 0, (1 << d) - 1) now[j] = 0, val[j] = pii();
for(auto [v, w] : q) {
// cerr << i << ' ' << w << endl;
// if(i == 0 && v == 4) cerr << "#@#@2" << endl;
rep(j, 0, (1 << d) - 1) {
for(; now[j] < siz(p[j]) && p[j][now[j]].y + w <= b; ++now[j]) {
// cerr << "#@!@!" << endl;
val[j] = val[j] + (f[(i << d) | (j ^ p[j][now[j]].x)] + ::w[v << d]);
// cout << val[j].x << ' ' << val[j].y << endl;
}
// if(i == 3 && v == 4 && j == 3) cerr << "#@#@" << ((v | i) << d | j) << ' ' << val[j].x << endl;
// if(((v | i) << d | j) == (1 << a) - 1) cerr << (val[j]).x << endl;
f[((v | i) << d) | j] = f[((v | i) << d) | j] + val[j];
}
}
}
cout << f[(1 << a) - 1].x << ' ' << f[(1 << a) - 1].y;
return cerr << endl << 1.0 * clock() / CLOCKS_PER_SEC << endl, 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 4ms
memory: 135068kb
input:
5 5 3 5 1 4 2 3 2 2 2 1
output:
9 4
result:
ok 2 number(s): "9 4"
Test #2:
score: -100
Wrong Answer
time: 96ms
memory: 139536kb
input:
18 10000000 956231 904623 1692946 1796774 1081323 1170319 3218792 2542661 3183376 3037270 1869132 1442561 35436 35018 1564635 1939950 1847344 2006043 755870 899310 1671882 2057413 1369264 1338951 3132483 3504034 2056224 1825640 1840949 1562071 1514040 1405352 2300821 2421801 2466540 3004920
output:
8375857 2
result:
wrong answer 1st numbers differ - expected: '9391997', found: '8375857'