QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#287120#982. Robotcy1999TL 0ms0kbC++143.1kb2023-12-19 18:11:042023-12-19 18:11:04

Judging History

This is the latest submission verdict.

  • [2023-12-19 18:11:04]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 0kb
  • [2023-12-19 18:11:04]
  • Submitted

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

output:


result: