QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#612355 | #9440. Train Seats | ucup-team5177# | WA | 2ms | 12080kb | C++14 | 2.8kb | 2024-10-05 10:40:47 | 2024-10-05 10:40:48 |
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 p[200100];
priority_queue<Node> q;
ll trl[800100];
ll trr[800100];
ll lz1[800100];
ll lz2[800100];
bool vis[200100];
inline void ins(ll x) {
for (ll i = 1; i <= n; i++) {
ll v = i;
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]);
}
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;
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;
}
} 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;
}
}
}
build(1, n, 1);
for (ll i = 1; i <= n; i++) {
ans += qry(1, n, 1, p[i]);
upd2(1, n, 1, 1, p[i], a[p[i]]);
upd1(1, n, 1, p[i], n, a[p[i]]);
}
printf("%lld\n", ans);
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 11996kb
input:
3 10 3 7 10
output:
28
result:
ok "28"
Test #2:
score: 0
Accepted
time: 0ms
memory: 12004kb
input:
5 20 3 10 11 14 17
output:
73
result:
ok "73"
Test #3:
score: -100
Wrong Answer
time: 2ms
memory: 12080kb
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'