QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#21584 | #2849. 弗雷兹的玩具商店 | gogo# | RE | 0ms | 7620kb | C++20 | 3.3kb | 2022-03-07 15:30:36 | 2022-05-08 03:40:03 |
Judging History
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 ...