#dDDLDPybttg050504. 1600:【例 4】旅行问题
1600:【例 4】旅行问题
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:POI 2004
John 打算驾驶一辆汽车周游一个环形公路。公路上总共有 个车站,按顺时针编号 到 。每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。
任务:判断以每个车站为起点能否按条件成功周游一周(顺时针和逆时针都要考虑)。
输入格式
第一行是一个整数 ,表示环形公路上的车站数;
接下来 行,每行两个整数 ,分别表示第 号车站的存油量(升)和第 号车站到下一站的距离(千米)。
注意:第 站的下一站是第 站(环形)。
输出格式
输出共 行,如果从第 号车站出发,一直按顺时针(或逆时针)方向行驶,能够成功周游一圈,则在第 行输出 TAK,否则输出 NIE。
样例
样例输入
5
3 1
1 2
5 2
0 1
5 4
样例输出
TAK
NIE
TAK
NIE
TAK
样例解释
车站数据():
- (3,1)
- (1,2)
- (5,2)
- (0,1)
- (5,4)
顺时针判断:
设 (表示从 站到 站油量的净变化)。
环形前缀和 (对 取模意义下累加,但这里我们做的是环形扫描)。
条件:从 出发顺时针可行当且仅当 ,,即最小前缀和 。
用单调队列维护窗口最小值即可。
逆时针同理,但需要反转方向并重新计算 。
最终每个站如果顺时针或逆时针有一个可行,输出 TAK,否则 NIE。
样例结果:
- 站1:可行
- 站2:不可行
- 站3:可行
- 站4:不可行
- 站5:可行
数据范围
对于全部数据:
时空限制
- 时间:
- 内存:
提示
此题需要分别判断 顺时针 和 逆时针 两个方向。
步骤:
1. 顺时针:
- 令 ;
- 构造长度为 的序列 ;
- 计算前缀和 ( 从 到 );
- 对于起点 (),需要检查 是否都 ,即 。
- 可以用单调队列维护窗口 的 最小值。
2. 逆时针:
- 逆时针时,从 出发先到 站,再到 ,以此类推。
- 重新定义 ,其中 (因为第 站的前一站是第 站);
- 类似顺时针,构造 的序列并求前缀和,用单调队列判断。
3. 合并:
- 如果 顺时针或逆时针有一个可行,则输出
TAK,否则NIE。
复杂度:。
注意:由于 很大,需要高效输入输出,使用 scanf/printf 或关闭同步的 cin/cout。