[BZOJ1998][Hnoi2010]Fsk物品调度

试题描述

现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位。流水线上有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最小的。 这样你得到了所有盒子的最终位置,现在你每次可以把某个盒子移动到空位上,移动后原盒子所在的位置成为空位。请问把所有的盒子移动到目的位置所需的最少步数。

输入

第一行包含一个整数t,表示数据组数。接下来t行,每行6个数,n,s,q,p,m,d意义如上所述。 对于30%的数据n<=100,对于100%的数据t<=20,n<=100000,s

输出

对于每组数据输出一个数占一行,表示最少移动步数。

输入示例

1
8 3 5 2 7 4

输出示例

6

数据规模及约定

t<=20,n<=100000

题解

刚刚在火车上调出了这道题。。。

关键在于如何求 pos 数组,不难发现式子中 d 是固定的,所以 xi 每增加 1,posi 就要增加 d,而 yi 每增加 1,posi 会增加 1.

再看看题目要求优先考虑令 yi 最小,即,固定 yi,改变 xi.假设我们已经把 yi 固定下来了,则可以将 1~n 的数按照对 d 取余得到的余数分类,通过 ci 和固定下来的 yi 的值确定要找的数在哪类,选取没有被选过的且离 ci “向右距离”(从 ci 出发向右走,遇到 n 就回到 0,继续向右到达该数所需的步数)最近的那个数就行了,可以用个并查集实现。那么如何固定 yi 呢?类似地,也可以对于每一类数建立一个并查集,当某一类数都被选取后,将该节点与左右合并,查找时找没有满的且离 yi + ci 所属的类“向右距离”最近的一类即可。

最后求步数不妨放自己yy。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define maxn 100010
#define LL long long
int n, s, q, p, m, d, gcdnd, pos[maxn];
bool has[maxn], h2[maxn];int fa[maxn], siz[maxn];
int findset(int x) { return x == fa[x] ? x : fa[x] = findset(fa[x]); }
int f2[maxn];
int find2(int x) { return x == f2[x] ? x : f2[x] = find2(f2[x]); }
int nxt(int x) { return (x + d) % n; }
int pre(int x) { return (x - d + n) % n; }
LL gcd(LL a, LL b) { return !b ? a : gcd(b, a % b); }
void add(int u, int x) {has[u] = 1;int v = findset(nxt(u));if(has[v]) fa[u] = v;v = findset(pre(u)); u = findset(u);if(u != v) { if(has[v]) fa[v] = u; }else {h2[x] = 1; int xx = find2(x);if(x < gcdnd - 1 && h2[x+1]){ v = find2(x + 1); if(x != v) f2[x] = v; }if(x && h2[x-1]){ v = find2(x - 1); if(x != v) f2[v] = x; }}return ;
}int main() {int T; scanf("%d", &T);while(T--) {scanf("%d%d%d%d%d%d", &n, &s, &q, &p, &m, &d); d %= n;
//      n = read(); s = read(); q = read(); p = read(); m = read(); d = read() % n;gcdnd = gcd(n, d);memset(has, 0, sizeof(has));memset(h2, 0, sizeof(h2));has[s] = 1;for(int i = 0; i < n; i++) fa[i] = i;for(int i = 0; i < gcdnd; i++) f2[i] = i;LL c = 0;for(int i = 1; i < n; i++) {c = (c * q + p) % m;LL cd = c % n % gcdnd;int y = find2(cd); if(h2[y]) y++; if(y >= gcdnd){ y = find2(0); if(h2[y]) y++; }int u;if(y - cd >= 0){ u = findset((c % n + y - cd) % n); if(has[u]) u = nxt(u); }else { u = findset((c % n + y - cd + gcdnd) % n); if(has[u]) u = nxt(u); }add(u, y); pos[i] = u;}//      for(int i = 1; i < n; i++) printf("%d ", pos[i]); puts("\n");for(int i = 0; i < n; i++) fa[i] = i, siz[i] = 1;for(int i = 1; i < n; i++) {int u = findset(i), v = findset(pos[i]);if(u != v) fa[v] = u, siz[u] += siz[v], siz[v] = 0;}for(int i = 0; i < n; i++) pos[i] = findset(i);sort(pos, pos + n);int ans = 0;for(int i = 0; i < n; i++) if((!i || pos[i] != pos[i-1]) && siz[pos[i]] > 1) ans += siz[pos[i]] + 1;if(siz[findset(0)] > 1) ans -= 2;printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5626514.html

[BZOJ1998][Hnoi2010]Fsk物品调度相关推荐

  1. 省选之前的未完成的计划(截至到省选)

    PLAN OF THE COMING HEOI good problems: -bzoj4823:[Cqoi2017]老C的方块 [*] -bzoj3171:[Tjoi2013]循环格 [*] -bz ...

  2. 边缘计算不“边缘”——助攻视频行业这几年

    随着边缘计算行业的不断发展,其业务也越来越广泛,越来越成熟.边缘计算的发展历程并不是一帆风顺,其运用起来也和传统云计算有很大不同.那么边缘计算行业所面对的挑战以及未来的发展是什么样的呢?有请网心科技的 ...

  3. 工业互联网加速制造业数字化转型

    工业互联网加速制造业数字化转型 工业互联网是工业智能化发展的关键综合信息基础设施,制造活动在其上方得以进行,一系列数字化转型的业务藉此才有可能开展.通过近几年实践和思考,制造企业已逐渐看到数字化转型的 ...

  4. 基于php酒店仓库管理系统的设计与实现(含word文档毕业设计php和mysql)

    摘要 当下是一个信息技术高速发达的时代,企业掌握计算机管理信息的技术, 以优化管理和节约成本.随着酒店的飞速发展,该酒店的物资也日益剧增,之前一直沿用传统的人工管理模式,仓库物品种类繁多且物品繁杂,在 ...

  5. linux处理机调度实验报告,处理机调度试验

    <处理机调度试验>由会员分享,可在线阅读,更多相关<处理机调度试验(19页珍藏版)>请在人人文库网上搜索. 1.实验报告的基本内容及要求1实验预习在实验前每位同学都需要对本次实 ...

  6. 广播网关GPC为MDS多媒体调度再添虎翼

    "旅客朋友们,开往北京方面的XXX次列车已进站,列车停靠一站台一道,请旅客们检票上车."伴随着车站广播系统传来的清晰的乘车提示,乘客们正有条不紊地乘车.如今,火车.汽车等车站的广播 ...

  7. 破51项国际榜单纪录!解读华为云擎天架构调度求解引擎

    摘要:华为云擎天调度与算法团队近日刷新PDPTW问题榜单中51项算例的世界最好记录. 华为云擎天调度与算法团队近日刷新PDPTW问题榜单中51项算例的世界最好记录.该榜单自1990年起由科学工业研究院 ...

  8. Linux桌面GUI系统的调度器应该怎么做才不卡顿呢?

    承接前面两篇文章,继续这个话题: 为什么Linux CFS调度器没有带来惊艳的碾压效果 https://blog.csdn.net/dog250/article/details/95729830 为什 ...

  9. java计算机毕业设计华水疫情预警与防护用品调度系统源码+mysql数据库+系统+LW文档+部署

    java计算机毕业设计华水疫情预警与防护用品调度系统源码+mysql数据库+系统+LW文档+部署 java计算机毕业设计华水疫情预警与防护用品调度系统源码+mysql数据库+系统+LW文档+部署 本源 ...

最新文章

  1. Android Handler 异步消息处理机制的妙用 创建强大的图片载入类
  2. 如何用 Python 和 Flask 建立部署一个 Facebook Messenger 机器人
  3. 2015快捷键在哪里设置_炒股软件的选择通达信软件的基本设置
  4. SSRF,以weblogic为案例
  5. 编译报错程序集版本高于所引用的程序集的版本
  6. 再造轮子之网易彩票-第一季(IOS 篇 by sixleaves)
  7. php win 输入密码,win10开机密码输入框不见了怎么办
  8. mui ajax的值php怎样获取,关于mui.ajax的设置,以及php取不到data值的问题的方法
  9. L1-019 谁先倒 (15 分)
  10. union和union all哪个效率高
  11. 折叠屏,vivo的高端打手?
  12. 微信小程序 开发者工具和真机调试都能正常请求访问,线上不能登录请求问题
  13. 第一章.计算机组成与体系结构
  14. luci html 页面,luci界面修改
  15. python输出数字怎么办_python怎么输出数字
  16. css 实现条纹背景效果
  17. 软件中的banner是什么意思??
  18. 设置WIN 7 截图工具的快捷方式
  19. 希捷移动硬盘Backup Plus Portable初始化及加密
  20. ”核高基“重大专项造成体制浪费就应该取消

热门文章

  1. python123系统基本信息获取_Python运维-获取当前操作系统的各种信息
  2. .net byte转java byte_CVE20200688的武器化与.net反序列化漏洞那些事
  3. websocket server client 编写
  4. python新手难点_初学两天python的操作难点总结
  5. java任务追踪预警怎么写_分布式系统中如何优雅地追踪日志(原理篇)
  6. float right不生效_【工具篇】程序员不愿意写 PPT 是姿势不对?
  7. 【Elasticsearch】es 使用Rollup在Elasticsearch 6.3中合并旧日志 上卷 Rollup
  8. 【java】深入理解Java的动态编译
  9. mac下Python2运行SparkSQL
  10. 78-spark2.2的编译