QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#21553 | #2849. 弗雷兹的玩具商店 | Skyowo# | RE | 3ms | 5644kb | C++14 | 2.8kb | 2022-03-07 14:59:50 | 2022-05-08 03:37:49 |
Judging History
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 ...