QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#612335 | #9440. Train Seats | ucup-team5177# | WA | 0ms | 20192kb | C++14 | 4.0kb | 2024-10-05 10:33:58 | 2024-10-05 10:34:00 |
Judging History
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] = i + 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] = i - 1;
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: 0ms
memory: 20192kb
input:
3 10 3 7 10
output:
28
result:
ok "28"
Test #2:
score: 0
Accepted
time: 0ms
memory: 18196kb
input:
5 20 3 10 11 14 17
output:
73
result:
ok "73"
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 18232kb
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'