QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#21553#2849. 弗雷兹的玩具商店Skyowo#RE 3ms5644kbC++142.8kb2022-03-07 14:59:502022-05-08 03:37:49

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-08 03:37:49]
  • 评测
  • 测评结果:RE
  • 用时:3ms
  • 内存:5644kb
  • [2022-03-07 14:59:50]
  • 提交

answer

// Skyqwq
#include <bits/stdc++.h>

#define pb push_back
#define fi first
#define se second
#define mp make_pair

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }

template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N = 200005, M = 61, INF = 1e9;

int n, m, q, c[N], v[N];

int d[N << 2][M], tv[M], tw[M], nw[M];

#define ls (p << 1)
#define rs (p << 1 | 1)

void inline pv(int p, int v) {
	for (int i = 1; i <= m; i++)
		nw[i] = d[p][i], d[p][i] = -INF;
	for (int i = 1; i <= m; i++) {
		int O = i + v;
		if (O > m) O -= m;
		chkMax(d[p][O], nw[i]);
	}
		
	tv[p] += v;
}

void inline pw(int p, int v) {
	for (int i = 1; i <= m; i++)
		d[p][i] += v;
	tw[p] += v;
}

void inline pushup(int p) {
	for (int i = 1; i <= m; i++)
		d[p][i] = max(d[ls][i], d[rs][i]);
}

void inline pushdown(int p) {
	if (tw[p]) {
		pw(ls, tw[p]);
		pw(rs, tw[p]);
		tw[p] = 0;
	}
	if (tv[p]) {
		pv(ls, tv[p]);
		pv(rs, tv[p]);
		tv[p] = 0;
	}
}

LL val[M], f[M];

void build(int p, int l, int r) {
	if (l == r) {
		for (int i = 1; i <= m; i++) d[p][i] = -INF;
		d[p][c[r]] = v[r];
		return;
	}
	int mid = (l + r) >> 1;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	pushup(p);
}

void chg(int p, int l, int r, int x, int y, int k, int o) {
	if (x <= l && r <= y) {
		if (o == 1) pv(p, k);
		else pw(p, k);
		return;
	}
	pushdown(p);
	int mid = (l + r) >> 1;
	if (x <= mid) chg(ls, l, mid, x, y, k, o);
	if (mid < y) chg(rs, mid + 1, r, x, y, k, o);
	pushup(p);
}

void qry(int p, int l, int r, int x, int y) {
	if (x <= l && r <= y) {
		for (int i = 1; i <= m; i++)
			chkMax(val[i], (LL)d[p][i]);
		return;
	}
	pushdown(p);
	int mid = (l + r) >> 1;
	if (x <= mid) qry(ls, l, mid, x, y);
	if (mid < y) qry(rs, mid + 1, r, x, y);
}

int main() {
	read(n), read(m);
	for (int i = 1; i <= n; i++) read(c[i]);
	for (int i = 1; i <= n; i++) read(v[i]);
	build(1, 1, n);
	 read(q);
	while (q--) {
		int op, l, r; read(op), read(l), read(r);
		if (op <= 2) {
			int d; read(d);
			chg(1, 1, n, l, r, d, op);
		} else {
			memset(f, 0, sizeof f);
			memset(val, 0, sizeof val);
			qry(1, 1, n, l, r);
			f[0] = 0;
			for (int i = 1; i <= m; i++) {
				//cout << i << " " << val[i] << endl;
				for (int j = i; j <= m; j++)
					chkMax(f[j], f[j - i] + val[i]);
			}
			LL a0 = 0, a1 = 0;
			for (int i = 1; i <= m; i++) {
				a0 += f[i];
				a1 ^= f[i];
			}
			printf("%lld %lld\n", a0, a1);
		}
	}
    return 0;
}



Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 5644kb

input:

4 10
1 6 10 2
100 2333 666 300
7
3 1 4
3 1 3
1 2 4 1
3 1 4
2 2 3 -1000
2 2 3 -600
3 2 4

output:

15165 2865
14165 2169
36630 798
4899 1273

result:

ok 4 lines

Test #2:

score: -100
Runtime Error

input:

200000 60
21 16 58 5 26 44 30 40 31 27 50 21 59 50 37 39 26 9 15 14 9 59 40 29 32 5 2 25 57 18 4 9 25 1 13 42 36 34 21 6 53 2 18 51 51 55 29 17 3 36 22 11 26 1 40 58 57 33 22 53 42 26 1 6 18 6 47 54 31 59 51 23 60 1 13 43 55 34 59 49 9 12 51 34 4 22 31 1 47 45 45 28 10 38 34 19 35 12 4 5 11 47 28 2 ...

output:


result: