WOJ#3882 旅行问题(POI2004)
描述
John打算驾驶一辆汽车周游一个环形公路。公路上总共有n车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。John必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。在一开始的时候,汽车内油量为零,John每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。
任务:判断以每个车站为起点能否按条件成功周游一周。
输入
第一行是一个整数n,表示环形公路上的车站数;
接下来n行,每行两个整数pi,di分别表示表示第i号车站的存油量和第i号车站到下一站的距离。
输出
输出共n行,如果从第i号车站出发,一直按顺时针(或逆时针)方向行驶,能够成功周游一圈,则在第i行输出TAK,否则输出NIE。
样例输入
3 1
1 2
5 2
0 1
5 4
样例输出
NIE
TAK
NIE
TAK
提示
对于全部数据,3≤n≤1e6,0≤pi≤2e9,0<di≤2e9
题解
先考虑暴力怎么做:首先拆环为链。对于每个车站,我们设a[i]=p[i]-d[i],处理出a[i]的前缀和,问题就变成了枚举起点i,判断在经过的车站中是否存在一个车站j,使得sum[j]-sum[i]<0,如果是,那么就不合法。容易发现这个算法的时间复杂度是O(n2)的。
考虑优化:我们将上面的式子移项:sum[j]<sum[i],于是问题就转化为了判断对于每一个起点i,其经过车站中sum[j]的最小值是否小于sum[i]。因此我们可以用一个单调队列来维护一个前缀和的最小值,走到队首对应的终点时弹出队首并记为合法,弹出队尾时记为不合法,时间复杂度降低到了O(n)。
放上代码:
#include<bits/stdc++.h>
using namespace std;
#define N 2000010
#define LL long long
int n,l,r,a[N],b[N],c[N],ans[N][];
LL sum[N][];
struct node{
int pos;
LL val;
}q[N];
int main(){
scanf("%d",&n);int m=n<<;
for(int i=;i<=n;i++){scanf("%d%d",&a[i],&b[i]);a[i+n]=a[i];b[i+n]=b[i];c[i]=c[i+n]=b[i-];}
c[]=c[n+]=b[n];
for(int i=;i<=m;i++) sum[i][]=sum[i-][]+a[i]-b[i];
for(int i=m;i>=;i--) sum[i][]=sum[i+][]+a[i]-c[i];
l=r=;q[l]=(node){,};
for(int i=;i<=m;i++){
while(l<=r&&q[l].pos+n+<=i){ans[q[l++].pos+][]=;}
while(l<=r&&q[r].val> sum[i][]){ans[q[r--].pos+][]=;}
q[++r]=(node){i,sum[i][]};
}
l=r=;q[r]=(node){m+,};
for(int i=m;i>=;i--){
while(l<=r&&q[l].pos-n->=i){ans[q[l++].pos-][]=;}
while(l<=r&&q[r].val> sum[i][]){ans[q[r--].pos-][]=;}
q[++r]=(node){i,sum[i][]};
}
for(int i=;i<=n;i++){
if(ans[i][]&ans[i+n][]) puts("NIE");
else puts("TAK");
}
return ;
}
WOJ#3882 旅行问题(POI2004)的更多相关文章
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- vijos P1780 【NOIP2012】 开车旅行
描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- nyoj 71 独木舟上的旅行(贪心专题)
独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...
- 【bzoj3531】 [SDOI2014]旅行
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
- tomcat源码分析(三)一次http请求的旅行-从Socket说起
p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...
- 11.14 T2 小x的旅行(小x的旅行)
1.小x的旅行 (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...
随机推荐
- 查看PL/SQL编译时的错误信息
编译无效对象是DBA与数据库开发人员常见的工作之一.对于编译过程中的错误该如何去捕获,下面给出两种捕获错误的方法. 一.当前数据库版本信息及无效对象 1.查看当前数据库版本 [sql] view pl ...
- Maven Pom文件标签详解
<span style="padding:0px; margin:0px"><project xmlns="http://maven.apache.or ...
- 前端之JavaScript:JS之DOM对象三
js之DOM对象三 一.JS中for循环遍历测试 for循环遍历有两种 第一种:是有条件的那种,例如 for(var i = 0;i<ele.length;i++){} 第二种:for ...
- ubuntu16.04 安装samba
安装samba 1.更新当前软件 sudo apt-get upgrade sudo apt-get update sudo apt-get dist-upgrade 2.执行 sudo apt-ge ...
- 【NOIP2013模拟联考6】选课
题目 你真的认为选课是那么容易的事吗?HYSBZ的ZY同志告诉你,原来选课也会让人产生一种想要回到火星的感觉.假设你的一周有n天,那么ZY编写的选课系统就会给你n堂课.但是该系统不允许在星期i和星期i ...
- Eclipse搭建Maven项目并上传SVN备份
本文出自:http://www.cnblogs.com/2186009311CFF/p/7226127.html 背景:近段时间在学着Java,想着用Java做BS的项目.但是项目一遇到问题又要重做, ...
- mysql LIKE通配符 语法
mysql LIKE通配符 语法 作用:用于在 WHERE 子句中搜索列中的指定模式.惠州大理石平板 语法:SELECT column_name(s) FROM table_name WHERE co ...
- new Date(str)返回 Invalid date问题
var date=new Date($("input[name='mettingTime']").val().replace(/-/g, "/")); var ...
- SQL 查询表字段长度, 名称, 类型, 存储过程创建和修改时间
获取存储过程的修改时间和创建时间查询建立时间 --表 select * from sysobjects where id=object_id(N'表名') and xtype='U' --表的结构 s ...
- Codeforces Round #351(Div 2)
熬到半夜打结果前一个小时提交代码的页面根本加载不进去,D题写完还因为小点没判被hack掉了... rating什么的都是身外之物了,于是乎喜闻乐见地又掉回绿名了. A题: *题目描述: Bear看一场 ...