题面

题意:你带着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. Android Studio连接夜神模拟器

    运行-cmd,进入夜神模拟器安装目录,进入目录下的bin 执行Nox_adb.exe connect 127.0.0.1:62001命令,connect左右都有空格. 执行命令后就可以连接到夜神模拟器 ...

  2. 搭建Hive所遇到的坑

    ##一.基本功能: 1.启动hive时报错 java.lang.ExceptionInInitializerError at java.lang.Class.forName0(Native Metho ...

  3. macOS下登录store或者xcode等应用时提示【this action could not be completed】

    sudo mkdir -p /Users/Shared sudo chown root:wheel /Users/Shared sudo chmod -R 1777 /Users/Shared === ...

  4. C#多线程方法 可传参

    //将线程执行的方法和参数都封装到一个类里面.通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数.using System; using System.Threading; //Thre ...

  5. Deutsch lernen (13)

    1.  die Sicherheit, -en  安全(性) Was ist Ihnen wichtiger: Freiheit oder Sicherheit? Wie ist es mit der ...

  6. Assembly之instruction之Register Mode

    Assembler Code Content of ROM MOV R10,R11 MOV R10,R11 Length: One or two words Operation: Move the c ...

  7. html 图片翻转

    var Lb = false; var Ub = false; function rotate(obj) { if (obj == "L") { if (Lb == false) ...

  8. 【Android】进程间通信IPC——AIDL

    AIDL官网定义AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口. 在 Androi ...

  9. 磁盘及文件系统管理(以及btrfs)

    Linux系统管理 磁盘分区及文件系统管理 raid lvm 网络属性管理 程序包管理 sed及awk 进程查看和管理 内核管理(内核的编译和安装) 系统启动流程 定制,编译内核,busybox 系统 ...

  10. PAT 1090. Highest Price in Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...