ACM/ICPC 2018亚洲区预选赛北京赛站网络赛
Posted gaudar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM/ICPC 2018亚洲区预选赛北京赛站网络赛相关的知识,希望对你有一定的参考价值。
题意:到一个城市得钱,离开要花钱。开始时有现金。城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0;
一个开始指针i,一个结尾指针j。指示一个区间。如果符合条件++j,并将收益加入sum中(收益可能是负数)。不符合就++i,并从sum中退掉收益直到sum>=0;区间长度为n时i的位置就是结果。
正确性证明:假设[a,b]是第一个合法区间。某时刻i,j都<a,i在a左边,因此j不可能扩到b右边(否则[a,b]不是第一个合法区间)。只可能j仍落在a左边,或者落到a,b中间。在i<a时,j不可能扩到b右边。j在a,b中间时,i不可能被退到a右边。
这样的尺取法以往还用来找和大于某值的最短连续区间。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=1000050,INF=0x7FFFFFFF; lon arr[4*SZ],nex[SZ]; int main() { std::ios::sync_with_stdio(0); //freopen("d:\1.txt","r",stdin); lon casenum; cin>>casenum; //scanf("%d",&casenum); for(lon time=1;time<=casenum;++time) //for(lon time=1;scanf("%d%d",&n,&k)!=EOF;++time) { lon n,c; cin>>n>>c; for(lon i=1;i<=n;++i)cin>>arr[i]; for(lon i=1;i<=n;++i) { cin>>nex[i]; arr[i]-=nex[i]; } for(int i=n+1;i<=2*n;++i)arr[i]=arr[i-n]; int sum=0,cnt=0,bg=1; bool ok=0; for(int i=1;i<=2*n;++i) { if(sum+arr[i]+c<0) { for(;bg<=i&&sum+arr[i]+c<0;++bg) { if(bg<i)sum-=arr[bg]; } if(bg<=i)sum+=arr[i]; } else { //if(bg==0)bg=i; sum+=arr[i]; if(i-bg+1>=n) { ok=1; break; } } } // cout<<" "<<ok<<endl; if(ok)cout<<bg<<endl; else cout<<-1<<endl; } return 0; }
以上是关于ACM/ICPC 2018亚洲区预选赛北京赛站网络赛的主要内容,如果未能解决你的问题,请参考以下文章
ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 ASaving Tang Monk II 状态搜索
ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II(优先队列广搜)
2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II BFS