6037 -- 【PA2015】Hazard

Description

有n个人在轮流玩赌博机,一开始编号为i的人有a[i]元钱。赌博机可以抽象为一个长度为m的仅包含1和-1的序列,若抽到1,那么你将得到1块钱;若抽到-1,你将输掉1块钱。
第1局,第1个人会抽到序列中的第1项;第2局,第2个人会抽到序列中的第2项;第3局,第3个人会抽到序列中的第3项......即:第i个人抽完后轮到第i+1个人去抽,特别地,第n个人抽完后轮到第1个人去抽。序列第i项被抽到之后,下一个被抽到的将会是第i+1项,特别地,序列第m项被抽到之后,下一个被抽到的将会是第1项。
如果在某一轮,有个人输光了所有的钱,那么这场赌博游戏就会结束,请求出游戏在哪一轮结束,或者判断这个游戏会永远进行下去。

Input

第一行包含一个正整数n(1<=n<=1000000),表示玩家的个数。
第二行包含n个正整数a[1],a[2],...,a[n](1<=a[i]<=1000000),依次表示每个玩家一开始持有的钱数。
第一行包含一个正整数m(1<=m<=1000000),表示序列的长度。
第四行包含一个长度为m的仅包含W和P的字符串,表示这个序列,其中W表示1,P表示-1。

Output

若游戏会永远进行下去,输出-1。否则输出游戏在哪一轮结束。

Sample Input

4 2 3 2 1 3 WPP

Sample Output

12

Source

root
此题难度很大

容易发现每个人都是独立的,那么我们只需要求出每个人在什么时候会没钱,最早没钱的那个人就是使得大家离开的那个人。如果大家都不会没钱那么就不会离开。

对于每个人,用类似 st 表的方式计算出每个人在经过2i轮之后硬币的变化,就可以轻松的算出这个人离开的时间。

时间复杂度 O(NlogN)

实际上要维护三个倍增数组代表最大的支付前缀,到的位置,还有支付和

code:

  1 #include<iostream>
  2 #include<cstdio>
  3 #define N 1000005
  4 using namespace std;
  5 long long n;
  6 long long m;
  7 long long NXT[N][21],PAY[N][21],DEL[N][21];
  8 void initalize() {
  9     for(long long i=1; i<=20; i++) {
 10         for(long long j=0; j<n; j++) {
 11             NXT[j][i]=NXT[NXT[j][i-1]][i-1];
 12             DEL[j][i]=DEL[j][i-1]+DEL[NXT[j][i-1]][i-1];
 13             PAY[j][i]=max(PAY[j][i-1],DEL[j][i-1]+PAY[NXT[j][i-1]][i-1]);
 14         }
 15     }
 16 }
 17 bool complete_round(long long step,long long &now,long long &money) {
 18     for(long long i=20; i>=0; i--) {
 19         if(step&(1<<i)) {
 20             if(money>PAY[now][i]) {
 21                 money-=DEL[now][i];
 22                 now=NXT[now][i];
 23             } else return false;
 24         }
 25     }
 26     return true;
 27 }
 28 long long rest_walk(long long now,long long money) {
 29     long long footstep=0;
 30     for(long long i=20; i>=0; i--) {
 31         if(money>PAY[now][i]) {
 32             footstep+=(1<<i)*n;
 33             money-=DEL[now][i];
 34             now=NXT[now][i];
 35         }
 36     }
 37     return footstep;
 38 }
 39 long long a[N],ans[N],isinf[N],min0=99999999999999999,bcc,siz[N],win[N],belong[N];
 40 long long read(){
 41     long long x=0,f=1;
 42     char c=getchar();
 43     while(!isdigit(c)){
 44         if(c=='-')f=-1;
 45         c=getchar();
 46     }
 47     while(isdigit(c)){
 48         x=(x<<3)+(x<<1)+c-'0';
 49         c=getchar();
 50     }
 51     return x*f;
 52 }
 53 int main() {
 54 //    freopen("game7.in","r",stdin);
 55     n=read();
 56     for(long long i=0; i<n; i++) {
 57         a[i]=read();
 58     }
 59     m=read();
 60     for(long long i=0; i<m; i++) {
 61         char c=getchar();
 62         while(c!='W'&&c!='P')c=getchar();
 63         if(c=='W')win[i]=-1;
 64         else win[i]=1;
 65     }
 66     for(long long i=0; i<m; i++) {
 67         if(belong[i])continue;
 68         long long now=i;
 69         bcc++;
 70         while(1) {
 71             siz[bcc]++;
 72             belong[now]=bcc;
 73             NXT[now][0]=(now+n)%m;
 74             PAY[now][0]=win[now];
 75             DEL[now][0]=win[now];
 76             now=NXT[now][0];
 77             if(belong[now])break;
 78         }
 79     }
 80     initalize();
 81     for(long long i=0; i<n; i++) {
 82         long long money=a[i],now=i%m;
 83         ans[i]=(i+1);
 84         if(complete_round(siz[belong[now]],now,money)) {
 85             long long delta=a[i]-money;
 86             if(delta<=0) {
 87                 isinf[i]=1;
 88                 continue;
 89             }
 90             ans[i]+=(a[i]/delta)*siz[belong[now]]*n-n;
 91             a[i]%=delta;
 92             ans[i]+=rest_walk(NXT[i%m][0],a[i]);
 93         }
 94         else ans[i]+=rest_walk(i%m,a[i]);
 95     }
 96     long long flag=0;
 97     for(long long i=0; i<n; i++) {
 98         if(!isinf[i]) {
 99             min0=min(min0,ans[i]);
100             flag=1;
101         }
102     }
103     if(flag)cout<<min0;
104     else puts("-1");
105     return 0;
106 }

over

转载于:https://www.cnblogs.com/saionjisekai/p/9872580.html

10.29T1 倍增+同余相关推荐

  1. hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)

    Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...

  2. 2,8,10,16进制转换

    先上个例子,方便以后复习,例子看不明白,说明算法已经忘了,再看详细分解 2->8 (1000)2 = 分解为001.000 左边=0*2^2+0*2^1+1*2^0=1 右边=0*2^2+0*2 ...

  3. 【2021春招】2021年阿里笔试真题3.6/3.8/3.10/3.12记录

    少壮不努力,老大徒伤悲! ali 2021.3.6 1411. 给 N x 3 网格图涂色的方案数 815. 公交路线 1 你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之 ...

  4. 疯魔余承东:四年间打造令苹果、三星敬畏的华为手机

    摘要:这几年移动互联网在中国不断地发展,而且发展是势不可挡.移动互联网和移动设备相成发展,三星和苹果平分天下的局面终将会被打破.随着国内科技公司的不断成熟,国产移动设备也不断迈向一个巅峰时代.相继华为 ...

  5. python正负数取余说明

    符号: / :除法运算,返回值不是int类型 //:除法运算,向下取整 %:取余 举例: print(12 // 10) # 输出1,取整print(12 / 10) # 输出1.2# 当被除数为负数 ...

  6. Python负数除法取余操作

    除法 print(-12/10) -1.2 取余 print(-123%10) print(-123%-10) 7 -3 在Python中,取余的计算公式与别的语言并没有什么区别:r=a-n*[a// ...

  7. 结构体运算符与取余_c语言取余(c语言去整和取余)

    1.1%12 == 1, 3%8 == 3;2.% 为取余运算,符号由被除数决定 e.g. -7%4 == - 3, 7%(-4) == 3, -7%(-4) == -3; C语言提供了一个取余数的运 ...

  8. python除法编程_Java和Python中的整数除法,取余,舍入

    关于除法,你也许觉得没什么值得谈论的,毕竟小学的时候体育老师就教过我们了.然而对于编程中使用的除法,我觉得还是有很多值得注意的细节的.为什么我想深究一下?因为我日常主要使用Java和Python编程, ...

  9. 一个关于10%-3的小问题

    今天一不小心发现了一个趣事,就是python在运算 10%-3和 -10%3时的输出结果竟然是-2和2,但是我们自己手动运算的话结果难道不是 1和-1吗?所以记录一下吧! python代码 print ...

最新文章

  1. 工信部:中国4G基站规模超200万个 4G用户数破5亿
  2. Kubernetes 稳定性保障手册 -- 日志专题
  3. php函数计算加法,JavaScript_javascript实现一个数值加法函数,废话不多说,直接奉上代码 JS - phpStudy...
  4. C语言#line预处理器
  5. 【转】使用Azure Rest API获得Access Token介绍
  6. 浅析.Net 在 winform及wpf中涉及界面交互的多线程类的封装
  7. .net邮件发送帮助类
  8. 腾讯X5 内核 的导入
  9. python中match的六种用法_python re.match()用法相关示例
  10. git服务器ip变更后的配置
  11. If today were the last day of my life
  12. 常用室内定位技术总结
  13. 产品设计指南:如何从零设计一款手机端产品(APP)?
  14. HJY-F931A/YJ三相电压继电器
  15. 二级python——(三)format()方法的基本使用
  16. C语言编程计算下列算式的值
  17. 单片机双机通信c语言实验心得,80C51单片机双机通信与多机通信的使用方法
  18. NUMECA系列: FINE / Open 10.1 最新版64位CFD流体集成环境
  19. 波段选股王怎么在市场中利用头肩底实现杀跌
  20. 风筒电吹风无刷驱动设计-电吹风无刷电机PCBA方案设计

热门文章

  1. python笔试题奥特曼打怪兽_python笔试做错的题目
  2. linux大批量删除文件,Linux rm删除大批量文件
  3. java 虚拟打印机_Java 通过物理、虚拟打印机打印Word文档
  4. 字符串函数用法 php,PHP字符串函数print()的用法
  5. 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务
  6. 10061 mysql,Navicat无法连接到MySQL server的10061错误
  7. php 应用程序错误,php – 应用程序中的错误处理函数
  8. HDLBits 系列(4)如何设计一定不会产生Latch的组合逻辑?
  9. Vivado之增量编译的实现
  10. 【 FPGA 】半带 FIR 滤波器(Half-band FIR Filter)