QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#388753#8005. Crossing the BorderRedreamMerWA 11ms69588kbC++173.2kb2024-04-13 19:17:372024-04-13 19:17:38

Judging History

This is the latest submission verdict.

  • [2024-04-13 19:17:38]
  • Judged
  • Verdict: WA
  • Time: 11ms
  • Memory: 69588kb
  • [2024-04-13 19:17:37]
  • Submitted

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'