bzoj 4295 [PA2015]Hazard 单调队列
2016-11-18 12:41
316 查看
对于每个人,他选的点为:x%m , (x+n)%m , (x+2n)%m …. (x+kn)%m会形成一个环。所有环的和为m。可能有一些人在一个环里
对于一个人,如果求出这个人在走的过程中经历的最小值和走一个循环值的变化,就可以求出这个人走了多少个循环和走这些环后的剩余值。如果求出这个人之后到达每一个值需要的最小步数就可以求出在走完环之后又走了多少步。
走一个循环值的变化可以直接求。
维护一个前缀和。
把环倍长,可以用单调队列求这个环上每一个人在走的过程中经历的最小值。
从后往前扫一遍维护后面每一个值的位置就可以求环上每一个人之后到达每一个值需要的步数。
对于一个人,如果求出这个人在走的过程中经历的最小值和走一个循环值的变化,就可以求出这个人走了多少个循环和走这些环后的剩余值。如果求出这个人之后到达每一个值需要的最小步数就可以求出在走完环之后又走了多少步。
走一个循环值的变化可以直接求。
维护一个前缀和。
把环倍长,可以用单调队列求这个环上每一个人在走的过程中经历的最小值。
从后往前扫一遍维护后面每一个值的位置就可以求环上每一个人之后到达每一个值需要的步数。
#include <bits/stdc++.h> using namespace std; #define N 4100000 #define A 2000000 #define ll long long int n,m,top,h,r; char s ; int a ,b ,vis ,st ,q ,mn ,last ,sum ; ll ans,lop ,step ; int main() { //freopen("tt.in","r",stdin); scanf("%d",&n); for(int i=0;i<n;i++)scanf("%d",&a[i]); scanf("%d%s",&m,s); for(int i=0;i<m;i++)b[i]=s[i]=='W' ? 1:-1; for(int now=0;now<m;now++) if(!vis[now]) { top=0; for(int i=now;!vis[i];i=(i+n)%m) st[++top]=i,vis[i]=1; h=1;r=0; for(int i=1;i<=top;i++) { sum[i]=sum[i-1]+b[st[i]]; while(h<=r&&sum[q[r]]>=sum[i])r--; q[++r]=i; } for(int i=1;i<=top;i++) sum[top+i]=sum[top+i-1]+b[st[i]]; for(int i=1;i<=top;i++) { if(q[h]<i)h++; mn[i]=-(sum[q[h]]-sum[i-1]); while(h<=r&&sum[q[r]]>sum[i+top])r--; q[++r]=i+top; } for(int i=top;i>=1;i--)last[sum[top+i]+A]=top+i; for(int i=top;i>=1;i--) { last[sum[i]+A]=i; for(int j=st[i];j<n;j+=m) { if(sum[top]>=0&&a[j]>mn[i]) {step[j]=-1;continue;} if(a[j]<=mn[i])step[j]=last[sum[i-1]-a[j]+A]-i+1; else { lop[j]=(a[j]-mn[i]-1)/(-sum[top])+1; int t=a[j]+lop[j]*sum[top]; step[j]=lop[j]*top+last[sum[i-1]-t+A]-i+1; } } } } ans=1ll<<60; for(int i=0;i<n;i++) if(step[i]!=-1) ans=min(ans,i+1+n*(step[i]-1)); if(ans==1ll<<60)puts("-1"); else printf("%lld\n",ans); return 0; }
相关文章推荐
- bzoj 4295 Hazard 【循环】【单调队列】【扫描】
- BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列
- bzoj 4385: [POI2015]Wilcze doły 单调队列
- 【BZOJ4385】[POI2015]Wilcze doły【单调队列】【前缀和】【Two Pointers】
- bzoj 4476: [Jsoi2015]送礼物 二分答案+单调队列
- BZOJ 3885 Usaco2015 Jan Cow Rectangles 单调队列+二分
- 【BZOJ 4385】[POI2015]Wilcze doły 单调队列
- [bzoj4385][POI2015]Wilcze doły_单调队列
- BZOJ 4385: [POI2015]Wilcze doły 单调队列
- 【bzoj3675】[Apio2014]序列分割 单调队列+斜率优化
- 【BZOJ2442】修建草坪(动态规划,单调队列)
- BZOJ.4293.[PA2015]Siano(线段树)
- HDU 5289 Assignment(多校2015 RMQ 单调(双端)队列)
- 【BZOJ1758】【WC2010】重建计划(点分治,单调队列)
- BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
- BZOJ 4292: [PA2015]Równanie
- BZOJ 1047 [HAOI2007]理想的正方形 单调队列DP
- [bzoj3126][USACO2013]Photo_动态规划_单调队列
- [主席树][单调栈] BZOJ 4369: [IOI2015]teams分组
- bzoj1047[HAOI2007]理想的正方形 单调队列