QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#388753 | #8005. Crossing the Border | RedreamMer | WA | 11ms | 69588kb | C++17 | 3.2kb | 2024-04-13 19:17:37 | 2024-04-13 19:17:38 |
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 = 1e15;
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;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 11ms
memory: 69588kb
input:
5 5 3 5 1 4 2 3 2 2 2 1
output:
-2147483647 0
result:
wrong answer 1st numbers differ - expected: '9', found: '-2147483647'