社区讨论
求调 (AC不了一点)
P4155[SCOI2015] 国旗计划参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m24rcs5n
- 此快照首次捕获于
- 2024/10/11 21:23 去年
- 此快照最后确认于
- 2025/11/04 17:25 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
char *p1, *p2, buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline int rd()
{
int x = 0, f = 1; char c = nc();
while (c < 48 || c > 57) f = c == 47 ? -1 : 1, c = nc();
while (c >= 48 && c <= 57) x = x * 10 + c - 48, c = nc();
return x * f;
}
int n, m, f[200005][20], res[200005];
struct cd
{
int id, l, r;
bool operator < (const cd &x) const
{
return r < x.r;
}
} cds[400005];
int main()
{
freopen("P4155.txt", "r", stdin);
n = rd(), m = rd();
for (int i = 1; i <= n; ++i) {
int x = rd(), y = rd();
if (x > y) y += m;
cds[i].id = i;
cds[i].l = x;
cds[i].r = y;
}
sort(cds+1, cds+n+1);
for (int i = 1; i <= n; ++i) {
cds[i+n] = {0, cds[i].l+m, cds[i].r+m};
}
int pt2 = 1;
for (int pt1 = 1; pt1 <= 2 * n; ++pt1) {
while (pt2 <= 2 * n) {
if (cds[pt1].r < cds[pt2].l) break;
++pt2;
}
f[pt1][0] = --pt2;
}
for (int j = 1; (1 << j) <= 2 * n; ++j) {
for (int i = 1; i <= 2 * n; ++i) {
if (f[i][j-1]) f[i][j] = f[f[i][j-1]][j-1];
}
}
for (int k = 1; k <= n; ++k) {
int tp = k, cnt = 1;
for (int j = 20; j+1; --j) {
if (f[tp][j] && cds[f[tp][j]].r - cds[k].l < m) {
tp = f[tp][j];
cnt += (1 << j);
}
}
res[cds[k].id] = cnt + 1;
}
for (int i = 1; i <= n; ++i) printf("%d ", res[i]);
// for (int i = 1; i <= n; ++i) printf("%d %d %d %d %d\n", i, cds[i].l, cds[i].r, cds[i].li, cds[i].ri);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...