QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#388754#8005. Crossing the BorderRedreamMerWA 96ms139536kbC++173.2kb2024-04-13 19:18:102024-04-13 19:18:11

Judging History

你现在查看的是最新测评结果

  • [2024-04-13 19:18:11]
  • 评测
  • 测评结果:WA
  • 用时:96ms
  • 内存:139536kb
  • [2024-04-13 19:18:10]
  • 提交

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'