第i轮,a[i%n]+=b[i%m]。

枚举i,计算它变为0的次数,假设为t,那么有t=i+kn。

对于所有的i和k,(i+kn)%m形成了若干个总长度为m的环。

对于每个a[i],先在环中求出一轮最多可以减少多少,以及一轮的增量是多少,由此可以求出在几轮后变为0。

再在前缀后缀分类讨论一下即可求出具体是在哪一局变为0。

时间复杂度$O(n+m)$。

#include<cstdio>
#define N 1000010
typedef long long ll;
const ll inf=2000000000000000000LL;
int n,m,i,j,k,x,a[N],b[N],v[N],t,q[N],s[N],pre[N],suf[N],g[N],c[N+N];ll f[N],ans=inf;char ch[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int min(int a,int b){return a<b?a:b;}
inline ll min(ll a,ll b){return a<b?a:b;}
int main(){
for(read(n);i<n;i++)read(a[i]),f[i]=inf,g[i]=N;
for(read(m),scanf("%s",ch),i=0;i<m;i++)b[i]=ch[i]=='W'?1:-1;
for(i=0;i<N+N;i++)c[i]=N;
for(i=0;i<n;i++)if(!v[i%m]){
for(t=0,j=i%m;!v[j];j=(j+n)%m)v[q[++t]=j]=1;
for(j=1;j<=t;j++)s[j]=s[j-1]+b[q[j]];
pre[0]=suf[t+1]=N;
for(j=1;j<=t;j++)pre[j]=min(pre[j-1],s[j]);
for(j=t;j;j--)suf[j]=min(suf[j+1],s[j]);
for(j=1;j<=t;j++){
x=min(pre[j-1]+s[t],suf[j])-s[j-1];
for(k=q[j];k<n;k+=m)if(x+a[k]<=0)g[k]=0;else if(s[t]<0)g[k]=(x+a[k])/(-s[t])+((x+a[k])%(-s[t])>0);
}
for(j=1;j<=t;j++){
for(k=q[j];k<n;k+=m)if(g[k]<N){
x=c[s[j-1]-g[k]*s[t]-a[k]-s[t]+N];
if(x<=t)f[k]=min(f[k],(1LL*g[k]*t+x-j+t)*n+k);
}
if(c[s[j]+N]>j)c[s[j]+N]=j;
}
for(j=1;j<=t;j++)c[s[j]+N]=N;
for(j=t;j;j--){
c[s[j]+N]=j;
for(k=q[j];k<n;k+=m)if(g[k]<N){
x=c[s[j-1]-g[k]*s[t]-a[k]+N];
if(x<=t)f[k]=min(f[k],(1LL*g[k]*t+x-j)*n+k);
}
}
for(j=1;j<=t;j++)c[s[j]+N]=N;
}
for(i=0;i<n;i++)ans=min(ans,f[i]+1);
if(ans<inf)printf("%lld",ans);else puts("-1");
return 0;
}

  

BZOJ4295 : [PA2015]Hazard的更多相关文章

  1. 【BZOJ4295】[PA2015]Hazard 乱搞

    [BZOJ4295][PA2015]Hazard Description 有n个人在轮流玩赌博机,一开始编号为i的人有a[i]元钱.赌博机可以抽象为一个长度为m的仅包含1和-1的序列,若抽到1,那么你 ...

  2. bzoj 4295 [PA2015]Hazard 贪心,暴力

    [PA2015]Hazard Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 69  Solved: 19[Submit][Status][Discus ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. wiredtiger - hazard pointers

    http://www.drdobbs.com/lock-free-data-structures-with-hazard-po/184401890 memory deallocation  lock- ...

  5. 实现无锁的栈与队列(5):Hazard Pointer

    两年多以前随手写了点与 lock free 相关的笔记:1,2,3,4,质量都不是很高其实(读者见谅),但两年来陆陆续续竟也有些阅读量了(可见剑走偏锋的技巧是多容易吸引眼球).笔记当中在解决内存释放和 ...

  6. verilog实现16位五级流水线的CPU带Hazard冲突处理

    verilog实现16位五级流水线的CPU带Hazard冲突处理 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4292869.html所增加的Hazard处 ...

  7. BZOJ 4291: [PA2015]Kieszonkowe 水题

    4291: [PA2015]Kieszonkowe Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...

  8. [PA2015]Rozstaw szyn

    [PA2015]Rozstaw szyn 题目大意: 一棵\(n(n\le5\times10^5)\)个点的树,其中有\(m\)个结点是叶子结点.叶子结点权值已知,你可以自己决定其余结点的权值,定义整 ...

  9. 风险指针(Hazard Pointer) 内存空间共享模型

    WiredTiger是一种高性能的开源存储引擎,现已在MongoDB中作为内模式应用.WiredTiger支持行存储.列存储两种存储模式,采用LSM Tree方式进行索引记录 WiredTiger支持 ...

随机推荐

  1. [BZOJ4632]树的编码

    [BZOJ4632]树的编码 试题描述 SHUXK 正在对一棵N个结点的有根树进行研究,首要的一件事就是对这棵树进行编码. lz 说:“这还不容易吗?我令根节点的编号为 1,然后保证每个结点的编号都比 ...

  2. [BZOJ1789][BZOJ1830][Ahoi2008]Necklace Y型项链

    [BZOJ1789][BZOJ1830][Ahoi2008]Necklace Y型项链 试题描述 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在玩比赛串项链的游戏,谁串的最快就能得到 ...

  3. RemObjects SDK Source For Delphi XE7

    原文:http://blog.csdn.net/tht2009/article/details/39545545 1.目前官网最新版本是RemObjects SDK for Delphi and al ...

  4. c++ builder xe2 (Embarcadero rad studio) 远程调试 同样适用于 delphi 远程调试 教程

    转载:http://www.cnblogs.com/zhangdongsheng/p/3411056.html 每次要远程调试的时候都要看半天的xe2英文帮助文档,今天正好有点时间,把它写下来. 一. ...

  5. django-cms 代码研究(二)bugs?

    djangocms集成到现有项目中后,发现了几个问题: 1. 现有项目的url匹配失效,下面requests请求被交给djangocms处理了 url(r'^admin/', include(admi ...

  6. HXOI 2014 PSet 4 Day 1 一模04日1 题解

    1. 最小花费(money.pas/c/cpp) 问题描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问 ...

  7. /lib /usr/lib /usr/local/lib区别

    昨天问我/usr/lib 和/usr/local/lib 我仅记得一个是系统的,一个是用户的,于是今天查了查,有两篇文章介绍的不错,usr 很多人都认为是user缩写,其实不然,是unix syste ...

  8. Master-Worker模式

    并行程序设计模式--Master-Worker模式 简介 Master-Worker模式是常用的并行设计模式.它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程.Master进 ...

  9. codeforces 468A. 24 Game 解题报告

    题目链接:http://codeforces.com/problemset/problem/468/A 题目意思:给出一个数n,利用 1 - n 这 n 个数,每个数只能用一次,能否通过3种运算: + ...

  10. linux下如何设置vip(虚拟ip)

    在做HA的时候需要为服务器设计虚拟IP,也就是一个主机对应多个IP地址?刚听起来好神奇,原来这样也是可能的看了下面的这个链接 自己配了一下http://hi.baidu.com/pbottle/ite ...