1533: [POI2005]Lot-A Journey to Mars

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 174  Solved: 76
[Submit][Status]

Description

Byteazar 决定去火星参加一个空间站旅行. 火星的所有空间站都位于一个圆上. Byteazar 在其中一个登陆然后变开始饶圈旅行.
旅行需要耗费油料,一升油料只能跑1米,每个空间站可以补给的油料都有所不同. Byteazar
每到一个空间站便可以把该空间站的油料全部拿走.(他的油箱是没有容量限制的) 但是如果走到某个时候突然没油了那么旅行便失败了. Byteazar
需要决定要在哪个地方登陆使得他能顺利访问完所有的空间站后回到他当初登陆的地方. 一个细节是他登陆后可以选择两个方向中的任意一个进行旅行.

Input

第一行是一个数N (3 <= N <= 1
000 000). 表示空间站的总数. 空间站从1 到 N标号. 接下来N 行每行两个数pi 和 di (pi<= 0, di >
0). 表示第i个空间站所储存的油料以及第i个到第i + 1个空间站之间的距离( dN 表示第N个空间站到第1个空间站的距离).
所有的油料以及所有的距离的和保证不超过2 000 000 000.

Output

输出n行,如果从第i个空间站登陆可以走遍所有的空间站那么打印TAK (YES is Polish), 否则打印NIE (NO in Polish).

Sample Input

5
3 1
1 2
5 2
0 1
5 4

Sample Output

TAK
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的更多相关文章

  1. [POI2005]A Journey to Mars --- 单调队列

    [POI2005]A Journey to Mars 题目描述: Byteazar 决定去火星参加一个空间站旅行. 火星的所有空间站都位于一个圆上. Byteazar 在其中一个登陆然后变开始饶圈旅行 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 【腾讯Bugly干货分享】微信终端跨平台组件 Mars 系列 - 我们如约而至

    导语 昨天上午,微信在广州举办了微信公开课Pro.于是,精神哥这两天的朋友圈被小龙的"八不做"刷屏了.小伙伴们可能不知道,下午,微信公开课专门开设了技术分论坛.在分论坛中,微信开源 ...

  4. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/9DJxipJaaBC8yC-buHgnTQ 作者简介: ...

  5. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  6. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  7. 【腾讯Bugly干货分享】微信mars 的高性能日志模块 xlog

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581c2c46bef1702a2db3ae53 Dev Club 是一个交流移动 ...

  8. 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][ ...

  9. [原创]Eclipse Mars 在Ubuntu升级后无法工作的解决方法

    近日将自己的Ubuntu从14.04LTS升级到了16.04LTS,顿时发现Eclipse不能正常工作了,到Ubuntu的官网上转了一圈发现以下解决方案: 症状: [1]Eclipse启动很慢; [2 ...

随机推荐

  1. [PWA] 0. Introduce to Offline First

    Why offline first? Imagin you are visiting a website, it is fine if wifi connection is good. It migh ...

  2. [Javascript] Advanced Console Log Arguments

    Get more mileage from your console output by going beyond mere string logging - log entire introspec ...

  3. mysql源码分析

    http://blog.csdn.net/u012935160/article/category/2697485

  4. Valgrind 安装与使用

    调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 2. 解压安装包:tar –jxvf ...

  5. Struts2里如何取得request,session,application

    第一种:取得MAP类型的request,session,application在java文件里写 package com.xjtu.st; import java.util.Map; import c ...

  6. JS 点击事件失效

    有时候,会发现js失效 ,代码如果是如下的时候 <input type="button" onclick="change()"value="変更 ...

  7. centos5.2 x86 安装 oracle 11g2r 日志

    一.安装centos 二.安装ora所需的库 三.修改centos内核 四.建用户组和目录结构等 五.安装ora11g2r 六.安装sqlplus的翻页程序和help补丁 七.自启动脚本 八.常用命令 ...

  8. js 实现win7任务栏拖动效果

    前言 在某个时刻, 我认识了一个朋友. 此人在我的教唆下, 踏上了js的不归路. 前天他问我, Win7任务栏拖动效果怎么实现. 我随口就跟他说, 这简单的一逼. 在我一晚上的折腾之后, 一份潦草的代 ...

  9. 跟我学android-Android应用结构分析(四)

    自动生成的R.java文件说明 public final class R { public static final class attr { } public static final class ...

  10. 【USACO 1.5.3】特殊的质数肋骨

    [题目描述]农民约翰的母牛总是生产出最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数 ...