BZOJ1533: [POI2005]Lot-A Journey to Mars
1533: [POI2005]Lot-A Journey to Mars
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 174 Solved: 76
[Submit][Status]
Description
旅行需要耗费油料,一升油料只能跑1米,每个空间站可以补给的油料都有所不同. Byteazar
每到一个空间站便可以把该空间站的油料全部拿走.(他的油箱是没有容量限制的) 但是如果走到某个时候突然没油了那么旅行便失败了. Byteazar
需要决定要在哪个地方登陆使得他能顺利访问完所有的空间站后回到他当初登陆的地方. 一个细节是他登陆后可以选择两个方向中的任意一个进行旅行.
Input
000 000). 表示空间站的总数. 空间站从1 到 N标号. 接下来N 行每行两个数pi 和 di (pi<= 0, di >
0). 表示第i个空间站所储存的油料以及第i个到第i + 1个空间站之间的距离( dN 表示第N个空间站到第1个空间站的距离).
所有的油料以及所有的距离的和保证不超过2 000 000 000.
Output
Sample Input
3 1
1 2
5 2
0 1
5 4
Sample Output
NIE
TAK
NIE
TAK
HINT
Source
题解:
苦尽而后甘来。。。
如果总油量<总路程显然全部输出no
否则若总油量==总路程,构造前缀和s[i]=sigma(p[j]-d[j]) j<i 。
把(i,s[i])画在平面直角坐标系上,则选择最下方的一个点记为k开刀
因为从k出发,这条折线总是上升的,转一圈回到k,不会往下说明不会出现油量不够,所以该点可行。
继续将其推广 若总油量>总路程,则仍像上面一样构造一条折线。
记 res=sigma(p[i]-d[i])
则i 可行的充要条件是:
1)i 点 之后没有在 i 点 下方的点
2)i 点 之前点j满足 s[j]+res<s[i]
想一下如何转一圈就可以理解了
然后就可以前缀最小值乱搞了。。。
代码待UPD(我不会说我写了但是WA了)
发现了更简单的方法T_T
jcvb:(+p[i]-d[i])自复制一遍接在后面,求前缀和。然后能用单调队列搞出每个点往右走的最远距离,>=n则可行。逆时针同理再做一遍。
话说和我的做法差不多一样啊,只不过思考难度小一点。。。
UPD:单调队列做法 已A
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 2000000+100
#define maxm 500+100
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
struct rec{int x,y;}a[maxn];
int b[maxn],sta[maxn],r[maxn],res,n;
bool can[][maxn];
void work(int k)
{
b[]=;
for1(i,n)b[i]=b[i-]+a[i].x-a[i].y;
for1(i,n)b[n+i]=b[n+i-]+a[i].x-a[i].y;
int top=;b[*n+]=-inf;
for0(i,(n<<)+)
{
while(top&&b[i]<b[sta[top]])r[sta[top--]]=i-;
sta[++top]=i;
}
for0(i,n-)if(r[i]-i+>=n)can[k][i+]=;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();
for1(i,n)a[i].x=read(),a[i].y=read(),res+=a[i].x-a[i].y;
if(res<){for1(i,n)printf("NIE\n");return ;}
work();
for1(i,n>>)swap(a[i],a[n+-i]);
int t=a[].y;
for1(i,n-)a[i].y=a[i+].y;
a[n].y=t;
work();
for1(i,n)if(can[][i]||can[][n+-i])printf("TAK\n");else printf("NIE\n");
return ;
}
我的做法 未A 不知为何 调了半天cena没调好 目测一些数据是对的
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 1000000+100
#define maxm 500+100
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
struct rec{int x,y;}a[maxn];
int b[maxn],c[maxn],res,n;
bool can[][maxn];
void work(int k)
{
for1(i,n)b[i]=b[i-]+a[i].x-a[i].y;
c[]=inf;can[k][]=;
for1(i,n-)
{
c[i]=min(c[i-],b[i]);
can[k][i+]=c[i]+res>=b[i]?:;
}
c[n]=inf;
for3(i,n-,)
{
c[i]=min(c[i+],b[i]);
if(can[k][i+])can[k][i+]=c[i]>=b[i]?:;
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();
for1(i,n)a[i].x=read(),a[i].y=read(),res+=a[i].x-a[i].y;
if(res<){for1(i,n)printf("NIE\n");return ;}
work();
for1(i,n>>)swap(a[i],a[n+-i]);
int t=a[].y;
for1(i,n-)a[i].y=a[i+].y;
a[n].y=t;
work();
for1(i,n)if(can[][i]||can[][n+-i])printf("TAK\n");else printf("NIE\n");
return ;
}
发现错误是 逆时针转的时候必须把路的方向转过来,也就是 从 i 出发走的是 d[i-1] T_T
还有我的做法中只要一个条件不满足就不行。。。
BZOJ1533: [POI2005]Lot-A Journey to Mars的更多相关文章
- [POI2005]A Journey to Mars --- 单调队列
[POI2005]A Journey to Mars 题目描述: Byteazar 决定去火星参加一个空间站旅行. 火星的所有空间站都位于一个圆上. Byteazar 在其中一个登陆然后变开始饶圈旅行 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【腾讯Bugly干货分享】微信终端跨平台组件 Mars 系列 - 我们如约而至
导语 昨天上午,微信在广州举办了微信公开课Pro.于是,精神哥这两天的朋友圈被小龙的"八不做"刷屏了.小伙伴们可能不知道,下午,微信公开课专门开设了技术分论坛.在分论坛中,微信开源 ...
- 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/9DJxipJaaBC8yC-buHgnTQ 作者简介: ...
- 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...
- hdu4059 The Boss on Mars(差分+容斥原理)
题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设 则 为一阶差分. 二阶差分: n阶差分: 且可推出 性质: 1. ...
- 【腾讯Bugly干货分享】微信mars 的高性能日志模块 xlog
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581c2c46bef1702a2db3ae53 Dev Club 是一个交流移动 ...
- bzoj 1537: [POI2005]Aut- The Bus 线段树
bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...
- [原创]Eclipse Mars 在Ubuntu升级后无法工作的解决方法
近日将自己的Ubuntu从14.04LTS升级到了16.04LTS,顿时发现Eclipse不能正常工作了,到Ubuntu的官网上转了一圈发现以下解决方案: 症状: [1]Eclipse启动很慢; [2 ...
随机推荐
- 多队列网卡简介以及Linux通过网卡发送数据包源码解读
http://blog.csdn.net/yanghua_kobe/article/details/7485254 首先我们看一下一个主流多队列网卡(E1000)跟多核CPU之间的关系图: 非多队列: ...
- 第四篇:R语言数据可视化之折线图、堆积图、堆积面积图
折线图简介 折线图通常用来对两个连续变量的依存关系进行可视化,其中横轴很多时候是时间轴. 但横轴也不一定是连续型变量,可以是有序的离散型变量. 绘制基本折线图 本例选用如下测试数据集: 绘制方法是首先 ...
- vim 学习相关记录
VIM 相关内容****************** vim 的三个模式: 编辑模式 --> 输入模式 --> 末行模式 编辑模式: 通常键入键盘值被理解成一个操作; 如: dd(删除行) ...
- ProgressBar 基本介绍
简介 ProgressBar 继承自View,用于在界面上显示一个进度指示的界面. 1.ProgressBar有两个进度,一个是android:progress,另一个是android:seconda ...
- codevs2622数字序列( 连续子序列最大和O(n)算法)
/* 算法描述:维护一个s[p]表示累加和 并且更新最大值ans 如果s[p]<0 则从p+1重新累加 证明:设某个区间的起点和终点分别为s t 分两种情况 1.t<p:设s2表示1到s的 ...
- ASP.NET-FineUI开发实践-14
以前写过一个表格自动补全,改下,就出现了部分级联修改.测试版本4.1.1 共享下JS,ext-part2.js 后台再来个得到数据的方法就可以了. 1.方法还是删除+插入,主要在 i ...
- 强引用,弱引用,4种Java引用浅解(涉及jvm垃圾回收)
http://www.jb51.net/article/49085.htm http://www.jb51.net/article/49085.htm
- 【转】Objective-C中一种消息处理方法performSelector: withObject:
原文 : http://www.cnblogs.com/buro79xxd/archive/2012/04/10/2440074.html Objective-C中调用函数的方法是“消息传递”,这 ...
- HashMap、HashTable学习
HashMap: HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安 ...
- 修路方案(nyoj)
算法:次小生成树 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. 现在已经知道哪些城市之间可以修路,如果修路,花费是多少. 现在 ...