社区讨论
WA11-13第二行输出存在2求hack数据或找出错误玄红名小号关
P2487[SDOI2011] 拦截导弹参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mhjd71wk
- 此快照首次捕获于
- 2025/11/04 00:38 4 个月前
- 此快照最后确认于
- 2025/11/04 00:38 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 5;
long long n, b[N], tot, c[N], h;
struct A {
long long x;
long double o;
} tr[N], dis[N];
struct S {
long long x, y, z, ans;
long double sum;
} q[N];
bool cmp(S X, S Y) {
return X.y < Y.y;
}
bool cmptwo(S X, S Y) {
return X.x < Y.x;
}
long long lowbit(long long x) {
return (x & (-x));
}
void add(long long x, long long ans, long long sum) {
for (long long i = x; i <= h; i += lowbit(i)) {
if (ans > tr[i].x) {
tr[i].x = ans, tr[i].o = sum;
} else if (ans == tr[i].x) {
tr[i].o += sum;
}
}
}
A Sum(long long x) {
A ans = {0, 0};
for (long long i = x; i; i -= lowbit(i)) {
if (ans.x < tr[i].x) {
ans = tr[i];
} else if (ans.x == tr[i].x) {
ans.o += tr[i].o;
}
}
return ans;
}
void Clear(long long x) {
for (long long i = x; i <= h; i += lowbit(i)) {
tr[i] = {0, 0};
}
}
void CDQ(long long l, long long r) {
if (l == r) {
return;
}
long long mid = (l + r) / 2;
CDQ(l, mid);
sort (q + l, q + mid + 1, cmp);
sort (q + mid + 1, q + r + 1, cmp);
long long i = l, j = mid + 1;
for (; i <= mid && j <= r;) {
if (q[i].y <= q[j].y) {
add(q[i].z, q[i].ans, q[i].sum);
i++;
} else {
A ans = Sum(q[j].z);
ans.x++;
if (ans.x > q[j].ans) {
q[j].ans = ans.x, q[j].sum = ans.o;
} else if (ans.x == q[j].ans) {
q[j].sum += ans.o;
}
j++;
}
}
for (; j <= r; j++) {
A ans = Sum(q[j].z);
ans.x++;
if (ans.x > q[j].ans) {
q[j].ans = ans.x, q[j].sum = ans.o;
} else if (ans.x == q[j].ans) {
q[j].sum += ans.o;
}
}
for (long long e = l; e < i; e++) {
Clear(q[e].z);
}
sort (q + l, q + mid + 1, cmptwo);
sort (q + mid + 1, q + r + 1, cmptwo);
CDQ(mid + 1, r);
}
int main() {
cin >> n;
for (long long i = 1; i <= n; i++) {
cin >> q[i].y >> q[i].z;
b[++tot] = q[i].y, c[++h] = q[i].z;
q[i].x = i, q[i].ans = 1, q[i].sum = 1;
}
sort (b + 1, b + 1 + tot), sort (c + 1, c + 1 + h);
tot = unique(b + 1, b + 1 + tot) - b - 1;
h = unique(c + 1, c + 1 + h) - c - 1;
for (long long i = 1; i <= n; i++) {
q[i].y = lower_bound(b + 1, b + 1 + tot, q[i].y) - b;
q[i].y = tot - q[i].y + 1;
q[i].z = lower_bound(c + 1, c + 1 + h, q[i].z) - c;
q[i].z = h - q[i].z + 1;
}
CDQ(1, n);
long long ans = 0;
long double sum = 0;
for (long long i = 1; i <= n; i++) {
if (q[i].ans > ans) {
ans = q[i].ans, sum = q[i].sum;
} else if (q[i].ans == ans) {
sum += q[i].sum;
}
dis[i] = {q[i].ans, q[i].sum};
}
cout << ans << "\n";
for (long long i = 1; i <= n; i++) {
q[i].x = -q[i].x, q[i].y = tot - q[i].y + 1, q[i].z = h - q[i].z + 1;
q[i].ans = q[i].sum = 1;
}
sort (q + 1, q + 1 + n, cmptwo);
CDQ(1, n);
for (long long i = 1; i <= n; i++) {
q[i].x = -q[i].x;
}
sort (q + 1, q + 1 + n, cmptwo);
for (long long i = 1; i <= n; i++) {
if (dis[i].x + q[i].ans - 1 == ans) {
long double o = (long double)dis[i].o * (long double)q[i].sum;
o /= sum;
printf("%.6f ", (double)o);
} else {
cout << (double)0.000 << " ";
}
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...