题面

题意:你带着K元要去n个城市,这n个城市是环形的,你可以选择任意一个起点,然后顺时针走,对于每个城市,到达时可以获得a元,但是从这里离开又需要花费b元,问你能否找到一个起点(输出花钱最少的那个),使得你能够走完一圈,不能输出-1

题解:首先对于环形问题,先把数组复制一次,现在从每个起点开始,满足条件的点就肯定可以进队,其实我们要求的一个i满足,从i到n+i的所有前缀和最小值一定要大于K,因为对于1个i只会进队一次出队一次,所以尺取一下

(我们一路判断的就是,带着K元能不能加上这段区间>=0,不能的话起点就要顺延,同时终点也顺延,每次只改变头首2个元素)

 #include<bits/stdc++.h>
#define N 2000010
using namespace std;
int T,ans,n,m,cnt,b[N],a[N],c[N];
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=n;i++) scanf("%d",&b[i]);
for (int i=;i<=n;i++)
{
c[i]=a[i]-b[i];
c[i+n]=c[i];
}
int l=,r=;
long long ans=;
while (l<=n && r-l+<=n)
{
ans+=c[r];
r++;
while (ans+m<)
{
ans-=c[l];
l++;
}
}
if (l>n) printf("-1\n");else printf("%d\n",l);
}
return ;
}

比赛时,队友为了实现类似想法,却苦于没听过尺取(我也没听过),和不是很能确定a[i]和b[i]是否能统一的问题,大力码的2种。

 #include<bits/stdc++.h>
using namespace std;
#define mem(a,i) memset(a,i,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define lowbit(x) (x&-x)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e6+;
ll a[maxn*];
ll b[maxn*];
int n;
ll sum;
int main() {
int caseCnt;
scanf("%d",&caseCnt);
while(caseCnt--) {
scanf("%d%lld",&n,&sum);
rep(i,,n-) scanf("%lld",&a[i]);
rep(i,n,*n-) a[i]=a[i-n];
rep(i,,n-) scanf("%lld",&b[i]);
rep(i,n,*n-) b[i]=b[i-n];
int l=;
while(l<n) {
if(sum+a[l]>=) {
break;
}
l++;
}
if(l==n) puts("-1");
else {
int r=l+;
ll res=sum+a[l];
ll temp=res;
bool ok=false;
while(r<*n) {
if(r-l==n) temp=res-b[r-];
else temp=min(res-b[r-],res-b[r-]+a[r]);
if(temp<) break;
if(r-l==n) {
ok=true;
break;
}
res=res-b[r-]+a[r];
r++;
}
if(ok) {
printf("%d\n",l+);
continue;
}
int ans;
while(l<n) {
while(l<r&&temp<) {
temp=temp-a[l]+b[l];
res=res-a[l]+b[l];
l++;
}
res=res-b[r-]+a[r];
if(l==r) {
while(l<n) {
if(sum+a[l]>=) {
break;
}
l++;
}
if(l==n) break;
r=l;
res=sum+a[l];
}
r=r+;
while(r<*n) {
if(r-l==n) temp=res-b[r-];
else temp=min(res-b[r-],res-b[r-]+a[r]);
if(temp<) break;
if(r-l==n) {
ans=l+;
ok=true;
break;
}
res=res-b[r-]+a[r];
r++;
}
if(ok) break;
}
if(!ok) puts("-1");
else {
printf("%d\n",ans);
}
}
}
return ;
}
 #include <cstring>
#include <cstdio>
#include<assert.h>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include<iostream>
#include<queue>
#include<functional>
#include <vector>
#include<set>
#include<string>
#include<map>
#include<unordered_set>
using namespace std;
long long a[], b[];
int main() {
long long i, j, k, n, m, l, r, res, t, c, ans;
scanf("%lld", &t);
while (t--)
{
scanf("%lld%lld", &n, &c);
for (i = ; i < n; i++) {
scanf("%lld", &a[i]);
a[n + i] = a[i];
}
for (i = ; i < n; i++) {
scanf("%lld", &b[i]);
b[n + i] = b[i];
}
l = ;
while (l < n&&c + a[l] < )
l++;
if (l == n)
{
printf("-1\n");
continue;
}
r = l; res = c + a[l];
bool ok = false;
while (l < n)
{
bool flag = false;
long long need = b[r];
if (a[r + ] < && r + != (n + l)) {
need -= a[r + ];
flag = true;
}
while (r < (n + l) && res >= need)
{
r++;
res = res - need;
if(!flag)
res = res + a[r];
flag = false;
if (r == (n + l - )) {
need = b[r];
flag = false;
}
else {
need = max(b[r], b[r] - a[r+]);
if (a[r+] < )
flag = true;
}
}
if (r == (l + n))
{
ok = true;
ans = l;
break;
}
res = res - need;
r++;
while (l < r&&res + b[l] - a[l] < ) {
res = res + b[l] - a[l];
l++;
}
if (!flag)
res += a[r];
if (l == r)
{
while (l < n&&c + a[l] < )
l++;
if (l == n)
{
break;
}
else
{
r = l;
res = c + a[l];
}
}
else
{
res = res + b[l] - a[l];
l++;
}
}
if (ok)
{
printf("%lld\n", ans + );
}
else
printf("-1\n");
}
}

2018亚洲区预选赛北京赛站网络赛 D.80 Days 尺取的更多相关文章

  1. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 D 80 Days (线段树查询最小值)

    题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...

  2. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛D-80 Days--------树状数组

    题意就是说1-N个城市为一个环,最开始你手里有C块钱,问从1->N这些城市中,选择任意一个,然后按照顺序绕环一圈,进入每个城市会有a[i]元钱,出来每个城市会有b[i]个城市,问是否能保证经过每 ...

  3. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...

  4. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 80 Days(尺取)题解

    题意:n个城市,初始能量c,进入i城市获得a[i]能量,可能负数,去i+1个城市失去b[i]能量,问你能不能完整走一圈. 思路:也就是走的路上能量不能小于0,尺取维护l,r指针,l代表出发点,r代表当 ...

  5. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛

    题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...

  6. hihoCoder #1831 : 80 Days-RMQ (ACM/ICPC 2018亚洲区预选赛北京赛站网络赛)

    水道题目,比赛时线段树写挫了,忘了RMQ这个东西了(捞) #1831 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an int ...

  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】

    任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...

  8. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B Tomb Raider 【二进制枚举】

    任意门:http://hihocoder.com/problemset/problem/1829 Tomb Raider 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 L ...

  9. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II(优先队列广搜)

    #include<bits/stdc++.h> using namespace std; ; ; char G[maxN][maxN]; ]; int n, m, sx, sy, ex, ...

随机推荐

  1. php基础知识 书写格式

    PHP,是英文超文本预处理语言Hypertext Preprocessor的递归缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言. php嵌入页面的标记有 ...

  2. DOM高级编程

    前言:W3C规定的三类DOM标准接口(换图)Core DOM(核心DOM),适用于各种结构化文档:XML DOM(Java OOP学过),专用于XML文档:HTML DOM,专用于HTML文档,下面了 ...

  3. 怎么不让别人ping服务器

    频繁地使用Ping命令会导致网络堵塞.降低传输效率,为了避免恶意的网络攻击,一般都会拒绝用户Ping服务器.为实现这一目的,不仅可以在防火墙中进 行设置,也可以在路由器上进行设置,并且还可以利用Win ...

  4. Python+selenium第一个自动化脚本

    第一个自动化脚本(用Python写的) from selenium import webdriver  #从selenium导入webdriber driver=webdriber.Firefox() ...

  5. JAVA 构建使用 Native 库

    Java 使用Native文件,一般分解为下面几个步骤: 在Java代码中使用native关键字声明一个本地方法 运行javah,获得包含该方法声明的C语言头文件(使用jni编程中的C函数名通常是相关 ...

  6. C++的Android接口---配置NDK

    一. 在安卓工具网站下载ADT:http://tools.android-studio.org/index.php 参考链接:http://1527zhaobin.iteye.com/blog/186 ...

  7. .NET 在序列化时使用全小写的属性名

    基于某些奇怪的需求,需要将一些对象序列化后输出,而且属性名又必须为小写形式. 解决过程 说到在 .NET 平台上序列化操作,那么第一个想到的应该就是 Json.NET 家的 Newtonsoft.Js ...

  8. The as! Operator

    Prior to Swift 1.2, the as operator could be used to carry out two different kinds of conversion, de ...

  9. shell 结合expect实现ssh登录并执行命令

    #!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...

  10. Testbench文件编写纪要(Verilog)

    之前在使用Verilog做FPGA项目中.以及其他一些不同的场合下,零散的写过一些练手性质的testbench文件,开始几次写的时候,每次都会因为一些基本的东西没记住.写的很不熟练,后面写的时候稍微熟 ...