UOJ #586. 旅行问题
【题目描述】:John 打算驾驶一辆汽车周游一个环形公路。公路上总共有n个车站,每个站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。任务:判断以每个车站为起点能否按条件成功周游一周。
【输入描述】:第一行是一个整数n,表示环形公路上的车站数;接下来n行,每行两个整数pi,di分别表示表示第i号车站的存油量和第i号车站到下一站的距离。
【输出描述】:输出共n行,如果从第i号车站出发,一直按顺时针(或逆时针)方向行驶,能够成功周游一圈,则在第i行输出 TAK,否则输出 NIE。
【样例输入】:5
3 1
1 2
5 2
0 1
5 4【样例输出】:TAK
NIE
TAK
NIE
TAK【时间限制、数据范围及描述】:时间:2s 空间:512M30%的数据:3<=n<=10^4;70%的数据:3<=n<=10^5;100%的数据:3<=n<=10^6;0<=pi<=2×10^9;0<di<=2×10^9;本题的暴力做法是将数组拓宽2倍,对其做一遍前缀和,每次对长度为n的序列进行区间减法,减去前一位数,即得到此长度为n的序列的前缀和,
然后看其中最小的是否>=0,一共做n次,然后统计答案即可.(这里的区间减法可以直接简化成求区间最小,然后判断其是否>=前一位数)
正解做法即用单调队列维护区间最小的数即可.
注意:每个站到下一个站的距离是顺时针给出的.Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=2000005;
long long sum[N];
int n,p[N],d[N],ok[N],Q[N];
void DP1(){int head=1,tail=0;for(int i=1;i<=n;i++){while(head<=tail&&sum[Q[tail]]>=sum[i]){--tail;}Q[++tail]=i;}for(int i=n+1;i<=2*n;i++){while(head<=tail&&sum[Q[tail]]>=sum[i]){--tail;}Q[++tail]=i;while(head<=tail&&Q[head]<=i-n-1){++head;}if(sum[Q[head]]>=sum[i-n-1]){ok[i-n]=1;}}
}
void DP2(){int head=1,tail=0;for(int i=n*2;i>=n+1;i--){while(head<=tail&&sum[Q[tail]]>=sum[i]){--tail;}Q[++tail]=i;}for(int i=n;i>=1;i--){while(head<=tail&&sum[Q[tail]]>=sum[i]){--tail;}Q[++tail]=i;while(head<=tail&&Q[head]>=i+n){++head;}if(sum[Q[head]]>=sum[i+n]){ok[i]=1;}}
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&p[i],&d[i]);p[i+n]=p[i];d[i+n]=d[i];sum[i]=sum[i-1]+p[i]-d[i];}for(int i=n+1;i<=n*2;i++){sum[i]=sum[i-1]+p[i]-d[i];}DP1();for(int i=n*2;i>=1;i--){sum[i]=sum[i+1]+p[i+1]-d[i];}DP2();for(int i=1;i<=n;i++){if(ok[i]){printf("TAK\n");}else{printf("NIE\n");}}return 0;
}
转载于:https://www.cnblogs.com/ukcxrtjr/p/11531260.html
UOJ #586. 旅行问题相关推荐
- UOJ#198 [CTSC2016]时空旅行
题目 UOJ#198 [CTSC2016]时空旅行 题解 QAQ允许我做一个悲伤的表情.这题题解真少.我要做一个造福人类的人. 首先呢可以看出,如果把每个时空当做一个节点,这是棵树,每个节点有一个添加 ...
- 【UOJ #198】【CTSC 2016】时空旅行
http://uoj.ac/problem/198 (先补一下以前的题解) 这道题5分暴力好写好调,链上部分分可以用可持久化线段树,每次旅行\(x\)值相同的可以用标记永久化线段树.我还听到某些神犇说 ...
- UOJ #588. 图图的旅行
[题目描述]: 图图计划去Bzeroth 的精灵王国去旅游,精灵王国由n 座城市组成,第i 座城市有3 个属性x[i],w[i],t[i].在精灵王国的城市之间穿行只能依靠传送阵,第i 座城市的传送阵 ...
- 【uoj】198:【CTSC2016】时空旅行-dfs序线段树凸包
传送门:uoj198 题解 y,z坐标无用. 先化简一下式子,假设选择的是第iii个星球,其x" role="presentation" style="posi ...
- uoj 198: [CTSC2016]时空旅行
一道比较套路的数据结构题.而且写起来也挺顺的. 首先可以发现y和z就是来卖萌的,无视即可.那么考虑一个点(星球)位置为x0,费用为c0,那么询问x到它的总花费为(x-x0)^2+c0=-2x0*x+( ...
- UOJ 2718 毕业旅行(diworth定理)
题意: 思路:Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度. Dilworth定理的对偶定理:对于一个偏序集,其最少反链划分数等于其最长链的长度. 最长反链= ...
- 2022-2028年中国在线旅行预订市场投资分析及前景预测报告
[报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了在线旅行行业相关概述.中国在线旅行行业运行环境.分析了中国在线旅行行 ...
- LeetCode简单题之旅行终点站
题目 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi .请你找出 ...
- usaco Cow Tours 牛的旅行
Cow Tours 牛的旅行 农民 John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场. 但是就目前而言,你能看到至少有两个牧区不连通.这样,农民 John 就有 ...
最新文章
- mysql 死锁记录
- JBOSS配置系统应用的端口号
- 卢伟冰暗示Redmi Note9即将到来:千元机的不二之选
- 提高Android Studio运行、编译速度方案
- 解决maven打包打不进lib下的第三方jar包问题
- leaks Android内存泄露,Android LeakCanary 检测内存泄露
- matlab中三维非线性拟合,matlab非线性拟合与绘制三维曲面
- Mysql 的 GROUP_CONCAT() 函数拼接串
- python做算法题优势_算法优点和缺点汇总(推荐AAA)
- android跳转到应用市场并进入指定包名的应用详情
- vulnhub Pwned: 1
- JavaScript学习笔记(25) JavaScript.then()这个方法是什么意思?
- 丙二硫醇/鸟嘌呤(BG)/Mn配合物修饰BODIPY氟化硼二吡咯荧光探针
- 探花交友_第2章-完善个人信息与MongoDB入门
- 运维校招面经汇总(来源牛客网)
- Jar包阿里云服务器后台运行
- LinuxProbe学习笔记(十一)
- VnlnHub Momentum
- 【纯干货】Linux内存管理(最透彻的一篇)
- 2019-8-19 [Linux] 1.简介 发行版本 组成 应用领域 与Windows对比