QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#612339#9440. Train Seatsucup-team5177#WA 3ms18224kbC++144.0kb2024-10-05 10:35:452024-10-05 10:35:45

Judging History

This is the latest submission verdict.

  • [2024-10-05 10:35:45]
  • Judged
  • Verdict: WA
  • Time: 3ms
  • Memory: 18224kb
  • [2024-10-05 10:35:45]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

struct Node {
	ll x, y;
	ll u;
	ll v;
	bool friend operator < (Node x, Node y) {
		return x.x * y.y > x.y * y.x;
	}
} st;

ll n, m, mx, s, ans, t;
ll a[200100];
ll pos1[200100];
ll pos2[200100];
ll p[200100];
priority_queue<Node> q;
vector<ll> g[200100];
ll trl[800100];
ll trr[800100];
ll lz1[800100];
ll lz2[800100];
bool vis[200100];

inline bool chk1(ll x) {
	if (pos1[pos1[x]] == -1) {
		return 0;
	} 
	ll y = pos1[x];
	ll z = pos1[y];
	if ((a[y] - a[x]) * (z - x) > (a[z] - a[x]) * (y - x)) {
		return 1;
	}
	return 0;
}

inline bool chk2(ll x) {
	if (pos2[pos2[x]] == -1) {
		return 0;
	} 
	ll y = pos2[x];
	ll z = pos2[y];
	if ((a[x] - a[y]) * (x - z) > (a[x] - a[z]) * (x - y)) {
		return 1;
	}
	return 0;
}

inline void ins(ll x) {
	for (ll i = 0; i < g[x].size(); i++) {
		ll v = g[x][i];
		if (vis[v]) {
			continue;
		}
//		if (!x) {
//			cout << "^%";
//		}
		st.u = v;
		st.v = x;
		st.x = abs(a[x] - a[v]);
		st.y = abs(x - v);
		q.push(st);
	}
	return;
}

void build(ll l, ll r, ll idx) {
	if (l == r) {
		trl[idx] = 0;
		trr[idx] = m + 1;
	} else {
		ll mid = (l + r) >> 1;
		build(l, mid, idx << 1);
		build(mid + 1, r, idx << 1 | 1);
	}
	return;
}

inline void pd(ll idx) {
	if (lz1[idx]) {
		trl[idx << 1] = lz1[idx << 1] = lz1[idx];
		trl[idx << 1 | 1] = lz1[idx << 1 | 1] = lz1[idx];
		lz1[idx] = 0;
	}
	if (lz2[idx]) {
		trr[idx << 1] = lz2[idx << 1] = lz2[idx];
		trr[idx << 1 | 1] = lz2[idx << 1 | 1] = lz2[idx];
		lz2[idx] = 0;
	}
	return;
}

void upd1(ll l, ll r, ll idx, ll L, ll R, ll x) {
	if (L <= l && r <= R) {
		trl[idx] = x;
		lz1[idx] = x;
	} else {
		pd(idx);
		ll mid = (l + r) >> 1;
		if (L <= mid) {
			upd1(l, mid, idx << 1, L, R, x);
		}
		if (mid < R) {
			upd1(mid + 1, r, idx << 1 | 1, L, R, x);
		}
	}
	return;
}

void upd2(ll l, ll r, ll idx, ll L, ll R, ll x) {
	if (L <= l && r <= R) {
		trr[idx] = x;
		lz2[idx] = x;
	} else {
		pd(idx);
		ll mid = (l + r) >> 1;
		if (L <= mid) {
			upd2(l, mid, idx << 1, L, R, x);
		}
		if (mid < R) {
			upd2(mid + 1, r, idx << 1 | 1, L, R, x);
		}
	}
	return;
}

inline ll qry(ll l, ll r, ll idx, ll x) {
	if (l == r) {
//		cout << "^" << trr[idx] << " " << trl[idx] << endl;
		return trr[idx] - trl[idx];
	} else {
		pd(idx);
		ll mid = (l + r) >> 1;
		if (x <= mid) {
			return qry(l, mid, idx << 1, x);
		} else {
			return qry(mid + 1, r, idx << 1 | 1, x);
		}
	}
}

int main() {
	scanf("%lld%lld", &n, &m);
	a[0] = 0;
	a[n + 1] = m + 1;
	for (ll i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
	}
	pos1[n + 1] = -1;
	for (ll i = n; i >= 0; i--) {
		pos1[i] = n + 1;
		while (chk1(i)) {
			pos1[i] = pos1[pos1[i]];
		}
		g[pos1[i]].push_back(i);
		g[i].push_back(pos1[i]);
	}
	pos2[0] = -1;
	for (ll i = 1; i <= n + 1; i++) {
		pos2[i] = 0;
		while (chk2(i)) {
			pos2[i] = pos2[pos2[i]];
		}
		g[pos2[i]].push_back(i);
		g[i].push_back(pos2[i]);
	}
	vis[0] = vis[n + 1] = 1;
	ins(0);
	ins(n + 1);
	while (!q.empty()) {
		Node tt = q.top();
		q.pop();
		if (vis[tt.u]) {
			continue;
		}
		ll x = 0;
//		cout << tt.u << " " << tt.v << " " << 1.0 * tt.x / tt.y << endl;
		if (tt.u < tt.v) {
			for (ll i = tt.u; i <= tt.v; i++) {
				if (vis[i]) {
					x = i - 1;
					break;
				}
				vis[i] = 1;
			}
			for (ll i = x; i >= tt.u; i--) {
				p[++t] = i;
				ins(i);
			}
		} else {
			for (ll i = tt.u; i >= tt.v; i--) {
				if (vis[i]) {
					x = i + 1;
					break;
				}
				vis[i] = 1;
			}
			for (ll i = x; i <= tt.u; i++) {
				p[++t] = i;
				ins(i);
			}
		}
	}
	build(1, n, 1);
	for (ll i = 1; i <= n; i++) {
		ans += qry(1, n, 1, p[i]);
//		cout << p[i] << " " << qry(1, n, 1, p[i]) << endl;
		upd2(1, n, 1, 1, p[i], a[p[i]]);
		upd1(1, n, 1, p[i], n, a[p[i]]);
	} 
//	for (ll i = 1; i <= n; i++) {
//		cout << p[i] << " ";
//	}
//	cout << endl;
	printf("%lld\n", ans);
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 18108kb

input:

3 10
3 7 10

output:

28

result:

ok "28"

Test #2:

score: 0
Accepted
time: 0ms
memory: 18108kb

input:

5 20
3 10 11 14 17

output:

73

result:

ok "73"

Test #3:

score: -100
Wrong Answer
time: 0ms
memory: 18224kb

input:

10 1000000000
136909656 243332691 643531997 505919307 43553384 657638276 57213246 179732866 357373203 182482400

output:

7174795384

result:

wrong answer 1st words differ - expected: '7649951260', found: '7174795384'