社区讨论

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 条回复,欢迎继续交流。

正在加载回复...