10.29T1 倍增+同余
6037 -- 【PA2015】Hazard
Description
第1局,第1个人会抽到序列中的第1项;第2局,第2个人会抽到序列中的第2项;第3局,第3个人会抽到序列中的第3项......即:第i个人抽完后轮到第i+1个人去抽,特别地,第n个人抽完后轮到第1个人去抽。序列第i项被抽到之后,下一个被抽到的将会是第i+1项,特别地,序列第m项被抽到之后,下一个被抽到的将会是第1项。
如果在某一轮,有个人输光了所有的钱,那么这场赌博游戏就会结束,请求出游戏在哪一轮结束,或者判断这个游戏会永远进行下去。
Input
第二行包含n个正整数a[1],a[2],...,a[n](1<=a[i]<=1000000),依次表示每个玩家一开始持有的钱数。
第一行包含一个正整数m(1<=m<=1000000),表示序列的长度。
第四行包含一个长度为m的仅包含W和P的字符串,表示这个序列,其中W表示1,P表示-1。
Output
Sample Input
Sample Output
Source
容易发现每个人都是独立的,那么我们只需要求出每个人在什么时候会没钱,最早没钱的那个人就是使得大家离开的那个人。如果大家都不会没钱那么就不会离开。
对于每个人,用类似 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 倍增+同余相关推荐
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...
- 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 ...
- 【2021春招】2021年阿里笔试真题3.6/3.8/3.10/3.12记录
少壮不努力,老大徒伤悲! ali 2021.3.6 1411. 给 N x 3 网格图涂色的方案数 815. 公交路线 1 你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之 ...
- 疯魔余承东:四年间打造令苹果、三星敬畏的华为手机
摘要:这几年移动互联网在中国不断地发展,而且发展是势不可挡.移动互联网和移动设备相成发展,三星和苹果平分天下的局面终将会被打破.随着国内科技公司的不断成熟,国产移动设备也不断迈向一个巅峰时代.相继华为 ...
- python正负数取余说明
符号: / :除法运算,返回值不是int类型 //:除法运算,向下取整 %:取余 举例: print(12 // 10) # 输出1,取整print(12 / 10) # 输出1.2# 当被除数为负数 ...
- Python负数除法取余操作
除法 print(-12/10) -1.2 取余 print(-123%10) print(-123%-10) 7 -3 在Python中,取余的计算公式与别的语言并没有什么区别:r=a-n*[a// ...
- 结构体运算符与取余_c语言取余(c语言去整和取余)
1.1%12 == 1, 3%8 == 3;2.% 为取余运算,符号由被除数决定 e.g. -7%4 == - 3, 7%(-4) == 3, -7%(-4) == -3; C语言提供了一个取余数的运 ...
- python除法编程_Java和Python中的整数除法,取余,舍入
关于除法,你也许觉得没什么值得谈论的,毕竟小学的时候体育老师就教过我们了.然而对于编程中使用的除法,我觉得还是有很多值得注意的细节的.为什么我想深究一下?因为我日常主要使用Java和Python编程, ...
- 一个关于10%-3的小问题
今天一不小心发现了一个趣事,就是python在运算 10%-3和 -10%3时的输出结果竟然是-2和2,但是我们自己手动运算的话结果难道不是 1和-1吗?所以记录一下吧! python代码 print ...
最新文章
- 工信部:中国4G基站规模超200万个 4G用户数破5亿
- Kubernetes 稳定性保障手册 -- 日志专题
- php函数计算加法,JavaScript_javascript实现一个数值加法函数,废话不多说,直接奉上代码
JS - phpStudy...
- C语言#line预处理器
- 【转】使用Azure Rest API获得Access Token介绍
- 浅析.Net 在 winform及wpf中涉及界面交互的多线程类的封装
- .net邮件发送帮助类
- 腾讯X5 内核 的导入
- python中match的六种用法_python re.match()用法相关示例
- git服务器ip变更后的配置
- If today were the last day of my life
- 常用室内定位技术总结
- 产品设计指南:如何从零设计一款手机端产品(APP)?
- HJY-F931A/YJ三相电压继电器
- 二级python——(三)format()方法的基本使用
- C语言编程计算下列算式的值
- 单片机双机通信c语言实验心得,80C51单片机双机通信与多机通信的使用方法
- NUMECA系列: FINE / Open 10.1 最新版64位CFD流体集成环境
- 波段选股王怎么在市场中利用头肩底实现杀跌
- 风筒电吹风无刷驱动设计-电吹风无刷电机PCBA方案设计
热门文章
- python笔试题奥特曼打怪兽_python笔试做错的题目
- linux大批量删除文件,Linux rm删除大批量文件
- java 虚拟打印机_Java 通过物理、虚拟打印机打印Word文档
- 字符串函数用法 php,PHP字符串函数print()的用法
- 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务
- 10061 mysql,Navicat无法连接到MySQL server的10061错误
- php 应用程序错误,php – 应用程序中的错误处理函数
- HDLBits 系列(4)如何设计一定不会产生Latch的组合逻辑?
- Vivado之增量编译的实现
- 【 FPGA 】半带 FIR 滤波器(Half-band FIR Filter)