【题目描述】: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. 旅行问题相关推荐

  1. UOJ#198 [CTSC2016]时空旅行

    题目 UOJ#198 [CTSC2016]时空旅行 题解 QAQ允许我做一个悲伤的表情.这题题解真少.我要做一个造福人类的人. 首先呢可以看出,如果把每个时空当做一个节点,这是棵树,每个节点有一个添加 ...

  2. 【UOJ #198】【CTSC 2016】时空旅行

    http://uoj.ac/problem/198 (先补一下以前的题解) 这道题5分暴力好写好调,链上部分分可以用可持久化线段树,每次旅行\(x\)值相同的可以用标记永久化线段树.我还听到某些神犇说 ...

  3. UOJ #588. 图图的旅行

    [题目描述]: 图图计划去Bzeroth 的精灵王国去旅游,精灵王国由n 座城市组成,第i 座城市有3 个属性x[i],w[i],t[i].在精灵王国的城市之间穿行只能依靠传送阵,第i 座城市的传送阵 ...

  4. 【uoj】198:【CTSC2016】时空旅行-dfs序线段树凸包

    传送门:uoj198 题解 y,z坐标无用. 先化简一下式子,假设选择的是第iii个星球,其x" role="presentation" style="posi ...

  5. uoj 198: [CTSC2016]时空旅行

    一道比较套路的数据结构题.而且写起来也挺顺的. 首先可以发现y和z就是来卖萌的,无视即可.那么考虑一个点(星球)位置为x0,费用为c0,那么询问x到它的总花费为(x-x0)^2+c0=-2x0*x+( ...

  6. UOJ 2718 毕业旅行(diworth定理)

    题意: 思路:Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度.            Dilworth定理的对偶定理:对于一个偏序集,其最少反链划分数等于其最长链的长度. 最长反链= ...

  7. 2022-2028年中国在线旅行预订市场投资分析及前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了在线旅行行业相关概述.中国在线旅行行业运行环境.分析了中国在线旅行行 ...

  8. LeetCode简单题之旅行终点站

    题目 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi .请你找出 ...

  9. usaco Cow Tours 牛的旅行

    Cow Tours 牛的旅行 农民 John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场. 但是就目前而言,你能看到至少有两个牧区不连通.这样,农民 John 就有 ...

最新文章

  1. mysql 死锁记录
  2. JBOSS配置系统应用的端口号
  3. 卢伟冰暗示Redmi Note9即将到来:千元机的不二之选
  4. 提高Android Studio运行、编译速度方案
  5. 解决maven打包打不进lib下的第三方jar包问题
  6. leaks Android内存泄露,Android LeakCanary 检测内存泄露
  7. matlab中三维非线性拟合,matlab非线性拟合与绘制三维曲面
  8. Mysql 的 GROUP_CONCAT() 函数拼接串
  9. python做算法题优势_算法优点和缺点汇总(推荐AAA)
  10. android跳转到应用市场并进入指定包名的应用详情
  11. vulnhub Pwned: 1
  12. JavaScript学习笔记(25) JavaScript.then()这个方法是什么意思?
  13. 丙二硫醇/鸟嘌呤(BG)/Mn配合物修饰BODIPY氟化硼二吡咯荧光探针
  14. 探花交友_第2章-完善个人信息与MongoDB入门
  15. 运维校招面经汇总(来源牛客网)
  16. Jar包阿里云服务器后台运行
  17. LinuxProbe学习笔记(十一)
  18. VnlnHub Momentum
  19. 【纯干货】Linux内存管理(最透彻的一篇)
  20. 2019-8-19 [Linux] 1.简介 发行版本 组成 应用领域 与Windows对比

热门文章

  1. js aop 拦载实现
  2. 从按下电源开关到bash提示符
  3. java10下编译lombok注解的代码
  4. Controller和RestController的区别
  5. 解决MVN install一直处于下载jar包等待问题
  6. Xtrabackup的“流”及“备份压缩”功能
  7. springsession 实现session 共享
  8. ArcGIS API for JavaScript 4.0(一)
  9. 性能测试工具MultiMechanize的使用介绍
  10. javascript继承机制