bzoj1998[Hnoi2010] Fsk物品调度

2024-05-11 23:58

本文主要是介绍bzoj1998[Hnoi2010] Fsk物品调度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:bzoj1998
题目大意:
有n个位置,从0到n-1依次编号,一开始0号位置空,其它的位置i上有编号为i的盒子。Lostmonkey要按照以下规则重新排列这些盒子。 规则由5个数描述,q,p,m,d,s,s表示空位的最终位置。首先生成一个序列c,c0=0,ci+1=(ci*q+p) mod m。接下来从第一个盒子开始依次生成每个盒子的最终位置posi,posi=(ci+d*xi+yi) mod n,xi,yi是为了让第i个盒子不与之前的盒子位置相同的由你设定的非负整数,且posi还不能为s。如果有多个xi,yi满足要求,你需要选择yi最小的,当yi相同时选择xi最小的。 这样你得到了所有盒子的最终位置,现在你每次可以把某个盒子移动到空位上,移动后原盒子所在的位置成为空位。请问把所有的盒子移动到目的位置所需的最少步数。

题解:
这算构造?+置换
啊pos搞的我一脸懵比啊。
先讲我会的置换(有什么用没学置换的都会)
假设pos求好了,就可以分成很多个互不相交的循环。对于一个长度大于1为cnt的循环,若含空格,那么使其达成目标的步数就是cnt-1;若不含,就要把空格换过来,达成目标后再换回去,即需要cnt+1步。

然后就是pos怎么构造了。大重点,不会这个就等于不会这题QAQ
观察posi=(ci+yi+d*xi) mod n这个式子,可以发现,若yi不变的话,xi的改变就相当于不断+d+d,在mod n下显然会成环。那么就相当于把n化成很多个环(一个yi就一个环)。
因为题目要在yi最小的条件下要xi最少,所以可以从0开始**枚举**yi。看看yi这个环里还有没有位置空着,有的话就找个最小的x来让i填。没有的话yi++,即跳到下个环里,重复以上步骤。
并查集找的就是环里还能填的。若最终找出来的也被找过了(即不是空的)就说明这个环被填完了。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define maxn 100010bool vis[maxn],pd[maxn];
int fa[maxn],pos[maxn];LL c[maxn];
int ffind(int x){return (x==fa[x])?x:fa[x]=ffind(fa[x]);}
void merge(int x,int y)
{int fx=ffind(x),fy=ffind(y);fa[fx]=fy;
}
int main()
{//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);int T,n,s,d,i,ans,cnt;LL q,p,mod;scanf("%d",&T);while (T--){scanf("%d%d%lld%lld%lld%d",&n,&s,&q,&p,&mod,&d);d%=n;c[0]=0;ans=0;for (i=0;i<n;i++){if (i) c[i]=(c[i-1]*q+p)%mod;fa[i]=i,vis[i]=0;pd[i]=0;}pos[0]=s;pd[s]=1;fa[s]=(s+d)%n;for (i=1;i<n;i++){int y=0,t=ffind((c[i]+y)%n);while (pd[t]){y++;t=ffind((c[i]+y)%n);}pos[i]=t;pd[t]=true;merge(t,(t+d)%n);}for (i=0;i<n;i++) if (!vis[i]){cnt=0;int x=i;bool zero=false;while (!vis[x]){cnt++;if (x==0) zero=true;vis[x]=true;x=pos[x];}if (cnt<=1) continue;if (zero) ans+=cnt-1;else ans+=cnt+1;}// for (i=1;i<n;i++) printf("%d ",pos[i]);printf("%d\n",ans);}return 0;
}

这篇关于bzoj1998[Hnoi2010] Fsk物品调度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981023

相关文章

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

目录 进程优先级: 是什么? 为什么存在进程优先级的概念呢? Linux为什么调整优先级是要受限制的? PRI vs NICE Linux的调度与切换 概念准备: 那我们到底怎样完成进程的调度和切换呢? 区分:寄存器VS寄存器的内容 Linux实现进程调度的算法,需要考虑优先级,考虑进程饥饿问题,考虑效率问题。 解决优先级问题: 解决进程饥饿问题: 解决效率的问题:

Thinkphp6.0+vue个人虚拟物品网站源码

Thinkphp6.0+vue个人虚拟物品网站源码 支持码支付对接 扫码自动发货 源码一共包含两个部分thinkphp6.0后端文件,以及vue前端文件。 服务器环境 php7以上,mysql5.6以上; 内附安装说明 代码免费下载

k8s调度(pod亲和、反亲和、污点、容忍度)

pod亲和性 针对对象为Pod,目的是实现,新建Pod和目标Pod调度到一起,在同一个Node上。 示例: apiVersion: v1kind: Podmetadata:name: testpod01labels:app: myapp01env: test1spec:containers:- name: testpod01image: nginx:1.23.2---apiVersio