QOJ.ac
QOJ
QOJ is currently under a maintenance. It might be unavailable in the following a few hours.
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#287120 | #982. Robot | cy1999 | TL | 0ms | 0kb | C++14 | 3.1kb | 2023-12-19 18:11:04 | 2023-12-19 18:11:04 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
#define ls (rt << 1)
#define rs (rt << 1 | 1)
using namespace std;
const int M = 6e5 + 10;
const int N = 1e5 + 10;
struct Node {
int opt, t, x, v;
}q[M];
struct node {
int k, b;
}t[M << 2];
int n, m, T, b[M], a[N], v[N], lst[N];
inline int read() {
char ch = getchar(); int x = 0, f = 1;
while (!isdigit(ch)) {if (ch == '-') {f = -1;} ch = getchar();}
while (isdigit(ch)) {x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}
return x * f;
}
inline int f(int x, int k, int B) {return k * b[x] + B;}
void work(int rt, int l, int r, int k, int b) {
int mid = (l + r) >> 1;
if (f(mid, k, b) > f(mid, t[rt].k, t[rt].b)) swap(t[rt].k, k), swap(t[rt].b, b);
if (l == r) return;
if (f(l, k, b) > f(l, t[rt].k, t[rt].b)) work(ls, l, mid, k, b);
if (f(r, k, b) > f(r, t[rt].k, t[rt].b)) work(rs, mid + 1, r, k, b);
}
void update(int rt, int l, int r, int ql, int qr, int k, int b) {
if (qr < l || ql > r || ql > qr) return;
if (ql <= l && r <= qr) return work(rt, l, r, k, b), void();
int mid = (l + r) >> 1;
if (ql <= mid) update(ls, l, mid, ql, qr, k, b);
if (qr > mid) update(rs, mid + 1, r, ql, qr, k, b);
}
void pre_update(int x, int l, int r) {
if (l == r) return;
int ed = a[x] + (b[r] - b[l]) * v[x];
int val = llabs(v[x]), len = llabs(a[x]);
if (a[x] > 0 && ed < 0) {
int mid = b[l] + len / val;
mid = upper_bound(b + 1, b + 1 + m, mid) - b - 1;
update(1, 1, m, l, mid, -val, val * b[l] + len);
int now = a[x] + (b[mid + 1] - b[l]) * v[x];
now = -now;
update(1, 1, m, mid + 1, r, val, -val * b[mid + 1] + now);
}else if (a[x] < 0 && ed > 0) {
int mid = b[l] + len / val;
mid = upper_bound(b + 1, b + 1 + m, mid) - b - 1;
update(1, 1, m, l, mid, -val, val * b[l] + len);
int now = a[x] + (b[mid + 1] - b[l]) * v[x];
update(1, 1, m, mid + 1, r, val, -val * b[mid + 1] + now);
}
else if (len < llabs(ed)) update(1, 1, m, l, r, val, -val * b[l] + len);
else update(1, 1, m, l, r, -val, val * b[l] + len);
}
int query(int rt, int l, int r, int x) {
if (l == r) return f(x, t[rt].k, t[rt].b);
int mid = (l + r) >> 1, res = f(x, t[rt].k, t[rt].b);
if (x <= mid) res = max(res, query(ls, l, mid, x));
else res = max(res, query(rs, mid + 1, r, x));
return res;
}
signed main() {
n = read(); T = read();
for (int i = 1; i <= n; ++i) a[i] = read();
char opt[10];
for (int i = 1; i <= T; ++i) {
q[i].t = b[i] = read();
scanf("%s", opt + 1);
if (opt[1] == 'c') {
q[i].opt = 0;
q[i].x = read(); q[i].v = read();
}
else q[i].opt = 1;
}
sort(b + 1, b + 1 + T); m = unique(b + 1, b + 1 + T) - b - 1;
for (int i = 1; i <= T; ++i) {
q[i].t = lower_bound(b + 1, b + 1 + m, q[i].t) - b;
if (q[i].opt == 0) {
pre_update(q[i].x, lst[q[i].x], q[i].t);
a[q[i].x] += v[q[i].x] * (b[q[i].t] - b[lst[q[i].x]]);
v[q[i].x] = q[i].v;
lst[q[i].x] = q[i].t;
}
}
for (int i = 1; i <= n; ++i) {
pre_update(i, lst[i], m);
a[i] += v[i] * (b[m] - b[lst[i]]);
lst[i] = m;
}
for (int i = 1; i <= T; ++i) {
if (q[i].opt == 0) continue;
printf("%lld\n", query(1, 1, m, q[i].t));
}
return 0;
}
詳細信息
Test #1:
score: 0
Time Limit Exceeded
input:
5 LRLDD