QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#21584#2849. 弗雷兹的玩具商店gogo#RE 0ms7620kbC++203.3kb2022-03-07 15:30:362022-05-08 03:40:03

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

answer

#include<bits/stdc++.h>
#define rep(i, l, r) for(int i = (l); i <= (r); i ++)
#define per(i, r, l) for(int i = (r); i >= (l); i --)
#define trv(i, u, v) for(int i = head[u], v = e[i].to; i; v = e[i = e[i].nxt].to)
#define fi first
#define se second
#define all(s) s.begin(), s.end()
#define sz(s) (int)(s.size())
#define lb(s) ((s) & -(s))
#define pb push_back
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
mt19937_64 hua(time(0));
template<typename T> inline bool chkmx(T &x, T y) {return x < y ? x = y, 1 : 0;}
template<typename T> inline bool chkmn(T &x, T y) {return y < x ? x = y, 1 : 0;}
template<int T> using A = array<int, T>;

inline int read() {
	int x = 0, f = 1; char c = getchar();
	for(; !isdigit(c); c = getchar()) if(c == '-')  f = 0;
	for(; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	return f ? x : -x;
}
const int maxm = 70;
const int maxn = 2e5;
const ll inf = 1e18;
int n, m, q, c[maxn + 5], v[maxn + 5];
struct Tag {
	ll d, c;
	friend Tag operator + (Tag x, Tag y) {
		return (Tag){x.d + y.d, (x.c + y.c) % m};
	}
};
struct Node {
	ll mx[maxm + 5];
	friend Node operator + (Node x, Node y) {
		Node z;
		rep(i, 1, m) { 
			z.mx[i] = max(x.mx[i], y.mx[i]);
		}
		return z;
	}
	friend Node operator + (Node x, Tag y) {
		Node z;
		rep(i, 1, m) {
			z.mx[i + y.c > m ? i + y.c - m : i + y.c] = x.mx[i] + y.d;
		}
		return z;
	}
};

struct Segment{
	#define ls u << 1
	#define rs u << 1 | 1
	#define mid (l + r >> 1)
	Node a[maxn + 5 << 2];
	Tag tag[maxn + 5 << 2];
	void seta(int u, Tag k) {a[u] = a[u] + k, tag[u] = tag[u] + k;}
	void pushdown(int u) {
		if(tag[u].c || tag[u].d) {
			seta(ls, tag[u]), seta(rs, tag[u]);
			tag[u] = {0, 0};
		}
	}
	void build(int u, int l, int r) {
		if(l == r) {
			rep(i, 1, m) a[u].mx[i] = -inf;
			a[u].mx[c[l]] = v[l];
			return ;
		}
		build(ls, l, mid), build(rs, mid + 1, r);
		a[u] = a[ls] + a[rs]; 
	}
	void upd(int u, int l, int r, int ql, int qr, Tag x) {
		if(l >= ql && r <= qr) return seta(u, x);
		pushdown(u);
		if(qr <= mid) upd(ls, l, mid, ql, qr, x);
		else if(ql > mid) upd(rs, mid + 1, r, ql, qr, x);
		else upd(ls, l, mid, ql, qr, x), upd(rs, mid + 1, r, ql, qr, x);
		a[u] = a[ls] + a[rs];
	}
	Node qry(int u, int l, int r, int ql, int qr) {
		if(l >= ql && r <= qr) return a[u];
		pushdown(u);
		if(qr <= mid) return qry(ls, l, mid, ql, qr);
		else if(ql > mid) return qry(rs, mid + 1, r, ql, qr);
		else return qry(ls, l, mid, ql, q) + qry(rs, mid + 1, r, ql, qr);
	}
}ds;
ll f[maxm + 5]; 
int main() {
//	freopen("in.txt", "r", stdin);
	n = read(), m = read();
	rep(i, 1, n) c[i] = read();
	rep(i, 1, n) v[i] = read();
	ds.build(1, 1, n);
	q = read();
	rep(i, 1, q) {
		int opt = read(), l = read(), r = read();
		if(opt == 1) {
			int d = read();
			ds.upd(1, 1, n, l, r, {0, d});
		}
		else if(opt == 2) {
			int d = read();
			ds.upd(1, 1, n, l, r, {d, 0});
		}
		else if(opt == 3) {
			Node x = ds.qry(1, 1, n, l, r);
//			rep(i, 1, m) cout << x.mx[i] << " \n"[i == m];
			rep(i, 0, m) f[i] = 0;
			rep(i, 1, m) {
				rep(j, 0, m - i) {
					chkmx(f[i + j], f[j] + x.mx[i]);
				}
			}
			ll sum = 0, xr = 0;
			rep(i, 1, m) sum += f[i], xr ^= f[i];
			cout << sum << ' ' << xr << '\n';
		}
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 7620kb

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: