bzoj1998: [Hnoi2010]Fsk物品调度

链接......不知道为啥放不动啊。

第一次用手机写bzoj的题,也是第一次用手机写的题解,顺便实现了一下手机上的对拍。

可以用链表+并查集维护一下什么的。

环之间的边是不是不太好路径压缩?

我是直接环内路径压缩,环外不管。

这样应该是会被卡的(d==n???)

可是交上去还是过了。

#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 110001
using namespace std;

int read_ca,read_p;
inline int read(){
    read_ca=getchar();read_p=0;
    while (read_ca<‘0‘||read_ca>‘9‘) read_ca=getchar();
    while (read_ca>=‘0‘&&read_ca<=‘9‘) read_p=read_p*10+read_ca-48,read_ca=getchar();
    return read_p;
}
vector <int> v[MN];
int T,m,q,p,n,s,d,c[MN],pos[MN],ne[MN],fi[MN],fa[MN],mmh,be[MN];
bool bo[MN];
int gf(int x){if (x==fa[x]) return x;else {int y=gf(fa[x]);if (be[x]==be[y]) fa[x]=y;return y;}}
inline void del(int x){
    if (ne[x]==x){
        for (int i=0;i<v[be[x]].size();i++) fa[v[be[x]][i]]=(v[be[x]][i]+1)%n;
    }else
    ne[fi[x]]=ne[x],fi[ne[x]]=fi[x],fa[x]=ne[x];
}
int main(){
    T=read();
    while (T--){
        n=read();s=read()%n;q=read();p=read();m=read();d=read();
        mmh=0;
        for (int i=1;i<n;i++) c[i]=(1LL*c[i-1]*q+p)%m;

        for (int i=0;i<n;i++) ne[i]=(i+d)%n,fi[ne[i]]=i,fa[i]=i,bo[i]=0;
        m=0;
        for (int i=0;i<n;i++)
        if (!bo[i]){
            m++;
            v[m].push_back(i);be[i]=m;
            for (int j=ne[i];j!=i;j=ne[j]) bo[j]=1,be[j]=m,v[m].push_back(j);

        }
        pos[0]=s;del(s);

        for (int i=1;i<n;i++) pos[i]=gf(c[i]%=n),del(pos[i]);

        memset(bo,0,sizeof(bo));
        for (int i=0;i<n;i++)
        if (pos[i]!=i&&!bo[i]){
            for (mmh++,m=i;!bo[m];)mmh++,bo[m]=1,m=pos[m];
        }
        printf("%d\n",mmh-(s?2:0));
        for (int i=1;i<=m;i++) v[i].clear();
    }
}

时间: 2025-01-04 23:43:53

bzoj1998: [Hnoi2010]Fsk物品调度的相关文章

【BZOJ】1998: [Hnoi2010]Fsk物品调度

http://www.lydsy.com/JudgeOnline/problem.php?id=1998 题意: 给你6个整数$n,s,q,p,m,d$. 有$n$个位置和$n-1$个盒子,位置编号从$0$开始(盒子编号从$1$开始).一开始第$i$个盒子在第$i$个位置上,$0$号位置是空位.然后有一个$pos$序列,其中$i$位置上放的盒子是$pos_i$(其中$s$位置上必须是空位).问:每次只能将一个盒子移动到空位上(然后这个盒子的位置变成空位),求从初始局面移动到$pos$局面的最少步

【BZOJ 1998】[Hnoi2010]Fsk物品调度 置换群+并查集

置换群的部分水得一比,据说是经典的置换群理论(然而我并不知道这理论是啥).重点就在于怎么求pos!!!容易发现这个东西是这样的:每次寻找pos,先在本环里找,找不到再往下一个环里找,直到找到为止……一开始我想二分或者是set,但是感觉会T,然后想了很久之后想到用并查集:就是维护每一个被占用的位置的下一个位置,因为这个位置被占用之后就会转向下一个位置,当然下一个位置有在环内部和在下一个环里两种情况,这两种情况都我都是用并查集维护的,但是一定要注意,不要把这两种情况写成一个并查集,这样路径压缩之后会

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

PLAN OF THE COMING HEOI good problems:-bzoj4823:[Cqoi2017]老C的方块 [*]-bzoj3171:[Tjoi2013]循环格 [*]-bzoj4200:[Noi2015]小园丁与老司机 [*]-bzoj1061:[Noi2008]志愿者招募 [*]-bzoj3600:没有人的算术 [*]-bzoj2806:[Ctsc2012]Cheat [*]-bzoj2219:数论之神 [*]-bzoj2595:[Wc2008]游览计划 [*]-bzoj

通过开发平台开发软件项目

通过SDP软件快速开发平台,开发应用的典型软件项目: 一.ERP(企业资源管理) ERP企业资源计划管理是一套基于物流.资金流.信息流进行全面一体化管理的管理信息系统. 主要功能包括:采购管理.销售管理.库存管理.生产管理.质量管理.应收管理.应付管理... ... 主要功能: (1).采购管理      采购计划.采购询价.比质比价.采购合同.采购订单.采购收料.采购退料 (2).销售管理      销售计划.销售报价.销售合同.销售订单.销售发货.销售退货 (3).库存管理      采购入

python的sched模块--延时调度

我们经常需要定时的执行某个任务,在Linux下我们有强大的crontab,但是在Python这个粒度(定时执行函数),如何处理呢?除了第三方的模块外,标准库为我们提供了sched模块和Timer类. 先说sched模块,准确的说,它是一个调度(延时处理机制),每次想要定时执行某任务都必须写入一个调度.使用步骤如下:(1)生成调度器:s = sched.scheduler(time.time,time.sleep)第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞.可以说sc

Linux进程管理与调度-之-目录导航【转】

转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 项目链接 进程的描述 进程的创建 进程的加载与运行 进程的退出 进程的调度 调度普通进程-完全公平调度器CFS 日期 内核版本 架构 作者 GitHub CSDN 2016-07-21 Linux-4.6 X86 & arm gatieme

AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203

[HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 int n,m,f[maxn],ch[maxn][2],rev[maxn],ki[maxn],sta[maxn],top,lit,size[maxn]; inline void in(int &now) { char Cget=getchar();now=0; while(Cget&

L2-014. 列车调度

火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道进入,最后从出口离开.在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入.如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度? 输入格式: 输入第一行给出一个整数N (2 <= N <= 105),下一行给出从1到N的整数序号的一个重排列.数字间以空格

Python小作业二(购买物品)

要求: 1.输入工资后,提供多种物品供选择. 2.有物品菜单及价格. 3.选择商品计算用户是否可以支付. 4.打印用户所购买的物品. 5.输出用户剩余的钱,问用户是否购物,结束. 逻辑图: 代码如下: #!/usr/bin/env python from tabulate import tabulate import time import sys goods = [["1","car",20000],["2","iphone"