【BZOJ1998】[HNOI2010]物品调度(并查集,模拟)
【BZOJ1998】[HNOI2010]物品调度(并查集,模拟)
题面
题解
先不管\(0\)位置是个空,把它也看成一个箱子。那么最终的答案显然和置换循环节的个数相关,对于大小为\(1\)的循环,显然就是不要动。对于大小为\(L\)的循环,如果包含\(0\)位置,显然还要动\(L-1\)次,如果不包含\(0\)位置,显然要先把\(0\)位置弄进这个环里面来,再把它移出去,也就是\(L+1\)次。那么我们就可以很容易的计算答案。
然而现在最大的难题变成了如何计算最终位置了。
对于每个位置,我们不难发现随着\(x\)的增大,关于\(n\)的余数一定是一个个的环。那么我们考虑枚举\(y\)值,检查\(y\)固定时,对应的这个环上是否还有空位,如果有就放进去。这个空位可以用并查集维护,每次将当前放完的位置指向下一个位置,即\(+d\)的位置。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int C[MAX],pos[MAX];
int n,S,Q,P,M,D;
int f[MAX];bool vis[MAX];
int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
void merge(int u,int v){f[getf(u)]=getf(v);}
int main()
{
int T=read();
while(T--)
{
n=read();S=read();Q=read();P=read();M=read();D=read();
for(int i=1;i<n;++i)C[i]=(1ll*C[i-1]*Q+P)%M;
for(int i=0;i<n;++i)f[i]=i;
memset(vis,0,sizeof(vis));
pos[0]=S;vis[S]=true;merge(S,(S+D)%n);
for(int i=1;i<n;++i)
{
int x=getf(C[i]%n),y=0;
while(vis[x])++y,x=getf((C[i]+y)%n);
pos[i]=x;vis[x]=1;merge(x,(x+D)%n);
}
memset(vis,0,sizeof(vis));int ans=0,gr=0;
for(int i=0;i<n;++i)
if(!vis[i])
{
int tot=0,u=i;
while(!vis[u])++tot,vis[u]=true,u=pos[u];
if(tot>1)ans+=tot,++gr;
}
if(!pos[0])ans+=gr;else ans+=gr-2;
printf("%d\n",ans);
}
return 0;
}
【BZOJ1998】[HNOI2010]物品调度(并查集,模拟)的更多相关文章
- HNOI 2010 物品调度 并查集 置换
题意: 题意有点细,暂不概括.请仔细审题. 分析: 我们先要把c生成出来. 记得颜神讲这道题,首先表明,这道题有两个问题需要处理. 第一个是要先定位,第二个是要求最小移动步数. 定位时对于每一个物品i ...
- hdu-1198 Farm Irrigation---并查集+模拟(附测试数据)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目大意: 有如上图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种 ...
- Codeforces 980 并查集/模拟贪心最小字典序 找规律/数去除完全平方因子 逆思维倍增预处理祖先标记点
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
- [HNOI2010]物品调度
题目描述 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号,一开始0号位置空,其它的位置i上有编号为i的盒子.Lostm ...
- 洛谷 - P4997 - 不围棋 - 并查集 - 模拟
https://www.luogu.org/problemnew/show/P4997 首先是改变气的定义,使得容易计算,这个很好理解. 然后使用并查集,因为要维护整个连通块的性质. 最后的难点在于, ...
- [HNOI2010] 物品调度 fsk
标签:链表+数论知识. 题解: 对于这道题,其实就是两个问题的拼凑,我们分开来看. 首先要求xi与yi.这个可以发现,x每增加1,则pos增加d:y每增加1,则pos增加1.然后,我们把x与y分别写在 ...
- P3207 [HNOI2010]物品调度
传送门 完了题目看错了--还以为所有的\(x,y\)都要一样--结果题解都没看懂-- 先考虑如果已经求出了所有的\(pos\)要怎么办,那么我们可以把\(0\)也看做是一个箱子,然后最后每个箱子都在一 ...
- (并查集)~APTX4869(fzu 2233)
http://acm.fzu.edu.cn/problem.php?pid=2233 Problem Description 为了帮助柯南回到一米七四,阿笠博士夜以继日地研究APTX4869的解药.他 ...
- FZu Problem 2233 ~APTX4869 (并查集 + sort)
题目链接: FZu Problem 2233 ~APTX4869 题目描述: 给一个n*n的矩阵,(i, j)表示第 i 种材料 和 第 j 种材料的影响值,这个矩阵代表这n个物品之间的影响值.当把这 ...
随机推荐
- spring boot配置统一异常处理
基于@ControllerAdvice的统一异常处理 >.这里ServerException是我自定义的异常,和普通Exception分开处理 >.这里的RequestResult是我自定 ...
- 51Nod 1815 调查任务
发现绍一的人很喜欢做51nod,不得不说这还是一个很全能的良心OJ 但是做的这道题就一点都不良心了,简直是毒瘤,调了一早上 首先我们考虑让一条路径的\(a_x\ mod\ a_y\)的值最大,我们简单 ...
- .NET日志记录之——log4net划重点篇
.NET日志记录之--log4net划重点篇 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不 ...
- RabbitMQ TroubleShooting
RabbitMQ是一款优秀的消息队列中间件,提供了稳定.监控完善的产品,但是软件就会有bug.为了前进路径可以畅通,我们必须了解出现的一些故障的快速处理方式,毕竟在生产环境,时间就是生命,尽快的处理是 ...
- linux-文件数据操作awk命令
最后一列是:交互外壳 单引号里的内容不会被bash扩展 cut 同样可以做到 "\t" 制表符 cut 和 sed 结合同样可以实现 扩展:匿名方法可以有多个,and方法只能有一个 ...
- 安装Visual Studio开发平台
1.找一个VS2013的安装包,下载到D盘上,勾选相应的选项安装. 安装的过程很漫长,至少需要一个小时. 2.安装已完成,启动. . 3.登录. \ 4启动VS2013. 5.新建c#类库 6.输入代 ...
- 个人博客week7
IBM大型机之父佛瑞德·布鲁克斯(Frederick P. Brooks, Jr.)在1986年发表的一篇关于软件工程的经典论文,便以<没有银弹:软件工程的本质性与附属性工作>(No Si ...
- 基于SSH框架的考勤管理系统的设计与实现
基于SSH框架的考勤管理系统的设计与实现
- python语言几个常见函数的使用
写代码,有如下变量,请按照要求实现每个功能: name = " Kobe Bean Bryant" a. 移除 name 变量对应的值左边的空格,并输出移除后的内容 name = ...
- [转] Linux有问必答:如何修复“sshd error: could not load host key”
编译自:http://ask.xmodulo.com/sshd-error-could-not-load-host-key.html作者: GOLinux 本文地址:https://linux.cn/ ...