首页 > 其他分享 >P4155 [SCOI2015] 计划

P4155 [SCOI2015] 计划

时间:2024-08-13 12:54:08浏览次数:12  
标签:战士 int 哨兵 计划 P4155 go SCOI2015 id

[SCOI2015] 计划 - 洛谷

核心思路

注意到,2^j = 2^{j-1}+2^{j-1}

可推出,f(i,j) = f(f(i,j-1),j-1)

f(i,j)  表示 战士 i 走 2^j 步到达战士位置。

若可以走到且 r < 终点 则答案 + 2^j

然后再加上自己这个哨兵,和走回自己的一个哨兵即可。

AC 代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+9;
int go[N][22];
int n,m;
struct soldier {
	int id, l, r;
} s[N];
void init(){
	for(int i = 1, p = i; i <= 2 * n; i++) {
		while(p <= 2*n&&s[p].l <= s[i].r){
			p++;
		}
		int pos = p-1;
		go[i][0] = pos;
	}
	for(int i = 1; i < 20; i++) {//这两个for循环顺序一定不能换!!!!
		for(int j = 1; j <= 2 * n; j++) {
			go[j][i] = go[go[j][i-1]][i-1];
		}
	}
}
bool cmp(soldier a,soldier b){
	return a.l < b.l;
}
int res[1145140];
void find(int k){
//	cout<<k<<endl;
	int lim = s[k].l + m,ans = 1,p = k;
	for(int i = 19;i >= 0;i--){
		if(go[k][i] != 0&& s[go[k][i]].r < lim){
			ans+=(1 << i);
			//cout<<k<<endl;
			k = go[k][i];
		}
	}
	//cout<<endl;
	res[s[p].id] = ans + 1;
}
int main(){
	
	cin>>n>>m;
	for(int i = 1; i <= n; i++) {
		cin >> s[i].l >> s[i].r;
		if(s[i].r < s[i].l)
			s[i].r += m;
		s[i].id = i;
	}
	sort(s + 1, s + 1 + n, cmp);
	for(int i = 1; i <= n; i++) {
		s[i + n] = s[i];
		s[i + n].l = s[i].l + m;
		s[i + n].r = s[i].r + m;
	}
	init();
	for(int i = 1; i <= n; i++)
		find(i);
	for(int i = 1; i <= n; i++)
		cout << res[i] << " ";
	return 0;
}

标签:战士,int,哨兵,计划,P4155,go,SCOI2015,id
From: https://blog.csdn.net/2301_77025310/article/details/141142064

相关文章

  • Linux进程和计划任务管理
    目录一、进程基本概念1.进程2.程序和进程的关系 二、查看进程信息1.ps命令1.1 psaux命令1.2ps-elf命令 2.top命令 3.pgrep命令 4.jobs命令 三、查看进程树 四、进程的启动方式1.手动启动2.调度启动五、终止进程的运行1.Ctrl+C组合键2.kill......
  • Linux系统计划任务
    Linux系统计划任务什么是计划任务,计划任务类似于我们平时⽣活中的闹钟。在Linux系统的计划任务服务crond可以满⾜周期性执⾏任务的需求。crond进程每分钟会处理⼀次计划任务,计划任务主要是做⼀些周期性的任务⽬前最主要的⽤途是定时备份数据计划任务分为以下两种情况:1......
  • 08.计划任务课后习题
    08.计划任务课后习题1.在linux系统中备份脚本backup.sh需要再每周1-5的每天下午1点和晚上8点执行,下列哪个cron命令可以完成(D)分时日月周a.013,20*1,2,3,4,5*backup.sh1到5月的下午一点和晚上八点执行b.013,201,5**backup.sh每个月一号和五......
  • leetcode递归(LCR 141. 训练计划 III)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。递归大部分题解可以使用迭代方式求解,使用递归是为了熟悉递归的解题思路。描述给定一个头节点为 head 的单链表用于记录一系列核心肌群训练编号,请将该系列训练编号 倒序 记录......
  • linux下进程与计划任务管理
    linux下进程与定时任务的管理进程与程序程序:存储在硬盘、光盘等介质中含有可执行代码的可执行文件。不删除就永久存在。状态为静态。进程:进程是资源分配的最小单位。临时存储在内存中(关机消失)。动态执行的代码。一个父进程可以拥有多个子进程。若该进程的父进......
  • 9 - Linux进程和计划任务管理
    目录一、进程1.程序和进程的关系2.查看进程信息2.1ps命令-查看进程信息2.2top命令-查看进程的动态信息2.3pgrep命令-查找进程信息2.4jobs命令-查看后台进程状态信息3.进程的启动方式4.进程的前后台调度5.中止进程的运行5.1Ctrl+C组合键5.2kill......
  • 软件项目管理资料汇总(规格说明书;详细设计;测试计划;验收报告)
       前言:在软件开发过程中,文档资料是非常关键的一部分,它们帮助团队成员理解项目需求、设计、实施、测试、验收等各个环节,确保项目的顺利进行。以下是各个阶段的文档资料概述:软件项目管理部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求......
  • Linux计划任务
    Linux计划任务Linux计划任务是系统管理和自动化的重要工具,可以减少人工干预、提高工作效率,并有效管理系统资源和维护。使用恰当的工具,可以显著提升系统的可靠性和运行效率。1.一次性计划任务at1.1下载安装yum-yinstallat#yum下载安装systemctlstartatd......
  • C语言编程题:“非常男女”计划(C语言版)
    1.题目描述展开近来,初一年的xxx小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实!验,他掌握了大量的实战经验。例如,据他观察,身高相近的人似乎比较合得来。万圣节来临之际,xxx准备在学校策划一次大型的“非常男女”配对活动。对于这次活动的参与者,xx......
  • 《大学新生编程入门指南:选择适合自己的编程语言和制定有效学习计划》
    编程小白如何成为大神?大学新生的最佳入门攻略编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?让我们一起探讨大学新生入门编程的最佳路径,为你的大学生活和未来职业......