2018亚洲区预选赛北京赛站网络赛 D.80 Days 尺取
题意:你带着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 尺取的更多相关文章
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 D 80 Days (线段树查询最小值)
题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛D-80 Days--------树状数组
题意就是说1-N个城市为一个环,最开始你手里有C块钱,问从1->N这些城市中,选择任意一个,然后按照顺序绕环一圈,进入每个城市会有a[i]元钱,出来每个城市会有b[i]个城市,问是否能保证经过每 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 80 Days(尺取)题解
题意:n个城市,初始能量c,进入i城市获得a[i]能量,可能负数,去i+1个城市失去b[i]能量,问你能不能完整走一圈. 思路:也就是走的路上能量不能小于0,尺取维护l,r指针,l代表出发点,r代表当 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛
题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...
- hihoCoder #1831 : 80 Days-RMQ (ACM/ICPC 2018亚洲区预选赛北京赛站网络赛)
水道题目,比赛时线段树写挫了,忘了RMQ这个东西了(捞) #1831 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an int ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】
任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B Tomb Raider 【二进制枚举】
任意门:http://hihocoder.com/problemset/problem/1829 Tomb Raider 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 L ...
- 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, ...
随机推荐
- php基础知识 书写格式
PHP,是英文超文本预处理语言Hypertext Preprocessor的递归缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言. php嵌入页面的标记有 ...
- DOM高级编程
前言:W3C规定的三类DOM标准接口(换图)Core DOM(核心DOM),适用于各种结构化文档:XML DOM(Java OOP学过),专用于XML文档:HTML DOM,专用于HTML文档,下面了 ...
- 怎么不让别人ping服务器
频繁地使用Ping命令会导致网络堵塞.降低传输效率,为了避免恶意的网络攻击,一般都会拒绝用户Ping服务器.为实现这一目的,不仅可以在防火墙中进 行设置,也可以在路由器上进行设置,并且还可以利用Win ...
- Python+selenium第一个自动化脚本
第一个自动化脚本(用Python写的) from selenium import webdriver #从selenium导入webdriber driver=webdriber.Firefox() ...
- JAVA 构建使用 Native 库
Java 使用Native文件,一般分解为下面几个步骤: 在Java代码中使用native关键字声明一个本地方法 运行javah,获得包含该方法声明的C语言头文件(使用jni编程中的C函数名通常是相关 ...
- C++的Android接口---配置NDK
一. 在安卓工具网站下载ADT:http://tools.android-studio.org/index.php 参考链接:http://1527zhaobin.iteye.com/blog/186 ...
- .NET 在序列化时使用全小写的属性名
基于某些奇怪的需求,需要将一些对象序列化后输出,而且属性名又必须为小写形式. 解决过程 说到在 .NET 平台上序列化操作,那么第一个想到的应该就是 Json.NET 家的 Newtonsoft.Js ...
- The as! Operator
Prior to Swift 1.2, the as operator could be used to carry out two different kinds of conversion, de ...
- shell 结合expect实现ssh登录并执行命令
#!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...
- Testbench文件编写纪要(Verilog)
之前在使用Verilog做FPGA项目中.以及其他一些不同的场合下,零散的写过一些练手性质的testbench文件,开始几次写的时候,每次都会因为一些基本的东西没记住.写的很不熟练,后面写的时候稍微熟 ...