QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#21556#2848. 城市地铁规划Skyowo#TL 0ms0kbC++142.9kb2022-03-07 15:00:402022-05-08 03:37:58

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:58]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2022-03-07 15:00:40]
  • 提交

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[N << 2], tw[N << 2], 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: 0
Time Limit Exceeded

input:

63 7
4 50 14 48 33 13 44 24

output:


result: