社区讨论

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

正在加载回复...