社区讨论

为什么没减一就过了

P4155[SCOI2015] 国旗计划参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m2c0nkbb
此快照首次捕获于
2024/10/16 23:17
去年
此快照最后确认于
2024/10/17 12:22
去年
查看原帖
CPP
#include <bits/stdc++.h>
#define foo(i, a, b) for (int i = a; i <= b; i++)
#define joo(i, a, b) for (int i = a; i >= b; i--)
#define mabs(a) ((a) < 0 ? (-(a)) : (a))
#define pow2(x) (1 << x)
#define QwQ 0

typedef long long ll;
typedef double dob;

const int MAXN = 2e5 + 17;
//const int MAXM = ;

using namespace std;
struct node {
	int c, d, id;
	bool operator < (node b) const {
		return c < b.c;
	}
}z[ 2 * MAXN];
int n, m, f[2 * MAXN][30], n2, lg[2 * MAXN + 17], res[MAXN];
void init() {
	int pos = 1;
	for (int i = 1; i <= n2; i ++) {
		while (z[pos].c <= z[i].d && pos <= n2) {
			pos ++;
		}
		f[i][0] = pos - 1;
	}
		
	for (int i = 1; i <= 25; i ++) {
		for (int s = 1; s <= n2; s ++) {
			f[s][i] = f[f[s][i - 1]][i - 1];
		}
	}
}

void get_ans(int x) {
	int len = z[x].d + m, cur = x, ans = 1;
	for (int i = 25; i >= 0; i--) {
		int pos = f[cur][i];
		if (z[pos].d < len && pos != 0 ) {
			ans += 1 << i;
			cur = pos;
		//	cerr << ans << ' ';
		}
	}//cerr << '\n';
	res[z[x].id] = ans ;
	
}

int main() {

	cin >> n >> m;
	foo (i, 1, n) {
		cin >> z[i].c >> z[i].d ;
		z[i].id = i;
		if (z[i].d < z[i].c) {
			z[i].d += m;
		}
	}
	n2 = n;
	sort (z + 1, z + n + 1) ;
	for (int i = 1; i <= n; i ++) {
		++n2;
		z[n2] = z[i];
		z[n2].c += m;  z[n2].d += m; z[n2].id = 0;
	}
		
	init();

	for (int i = 1; i <= n; i ++) 	get_ans(i);
	
	foo(i, 1, n) cout << res[i] << ' ';
	
	
	return QwQ;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...