QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#21556 | #2848. 城市地铁规划 | Skyowo# | TL | 0ms | 0kb | C++14 | 2.9kb | 2022-03-07 15:00:40 | 2022-05-08 03:37:58 |
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[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