Gym 100646 F Tanks a Lot RMQ
- Problem F: Tanks a Lot
- Imagine you have a car with a very large gas tank - large enough to hold whatever amount you need.
- You are traveling on a circular route on which there are a number of gas stations. The total gas in all
- the stations is exactly the amount it takes to travel around the circuit once. When you arrive at a gas
- station, you add all of that station’s gas to your tank. Starting with an empty tank, it turns out there
- is at least one station to start, and a direction (clockwise or counter-clockwise) where you can make it
- around the circuit. (On the way home, you might ponder why this is the case - but trust us, it is.)
- Given the distance around the circuit, the locations of the gas stations, and the number of miles your
- car could go using just the gas at each station, find all the stations and directions you can start at and
- make it around the circuit.
- Input
- There will be a sequence of test cases. Each test case begins with a line containing two positive integers
- c and s, representing the total circumference, in miles, of the circle and the total number of gas stations.
- Following this are s pairs of integers t and m. In each pair, t is an integer between and c− measuring
- the clockwise location (from some arbitrary fixed point on the circle) around the circumference of one
- of the gas stations and m is the number of miles that can be driven using all of the gas at the station.
- All of the locations are distinct and the maximum value of c is ,. The last test case is followed
- by a pair of ’s.
- Output
- For each test case, print the test case number (in the format shown in the example below) followed by a
- list of pairs of values in the form i d, where i is the gas station location and d is either C, CC, or CCC,
- indicating that, when starting with an empty tank, it is possible to drive from location i around in a
- clockwise (C) direction, counterclockwise (CC) direction, or either direction (CCC), returning to location
- i. List the stations in order of increasing location.
- Sample Input
- Sample Output
- Case : C CC C
- Case : CCC CCC CCC CCC CCC
题意:给你一个长度为c的环,环上面有m个加油站,各个加油站油的总和刚好够你在环上面跑一圈,一开始你的车没有油,现在你可以选一个加油站作为出发点并获得该加油站的所有油,然后选择顺时针或逆时针行走,没经过一个加油站你可以获得那里的油,问是否可以最终回到选择为起始的那个加油站。 这m个加油站有哪些是可以作为起始点的,可以的话应该顺时针出发还是逆时针出发还是两个方向都可以?
思路:对于环可以头尾接一遍变成直线,将加油站按顺序排列。设need_i为只用第i个加油站的油到第i+1个加油站还需要的油量, 比如1(2)---》 5(3)---》7(1) 那么从油站1到油站5还欠了2, 即need为-2, 从油站5到油站7多了2,即need为2
那么对于第i个加油站能作为起点,相当于从i开始的need数组的前缀和不能为负数。 那么我们可以直接做一遍前缀和,然后对于一个区间[l,r],要想以l位置为起点的前缀和在这个区间没有负数,相当于sum[l-1]<=min(sum[k]) l<=k<=r 相当于这个区间的值都减去sum[l-1] 查询区间最小值可以用rmq处理
对于逆时针方向 做法就完全一样了,逆着求一下need数组。
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <queue>
- #include <vector>
- #include <string>
- #include <stack>
- #include <cmath>
- #include <cstdlib>
- #include <iostream>
- #include <map>
- #include <set>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- typedef long long ll;
- const int N = 5e5 + ;
- int sum1[N], sum2[N];
- int dir[N];
- int dp[N][];
- int mm[N];
- int n, k;
- struct node {
- int t, m;
- friend bool operator < (node a, node b) {
- return a.t < b.t;
- };
- };
- node g[N];
- void initRMQ(int nn, int b[]) {
- mm[] = -;
- for(int i = ; i <= nn; ++i)
- {
- mm[i] = ((i & (i - )) == ) ? mm[i - ] + : mm[i - ];
- dp[i][] = b[i];
- }
- for(int j = ; j <= mm[nn]; ++j)
- for(int i = ; i + ( << j) - <= nn; ++i)
- dp[i][j] = min(dp[i][j - ], dp[i + ( << (j-))][j - ]);
- }
- int rmq(int x, int y) {
- int k = mm[y - x + ];
- return min(dp[x][k], dp[y - ( << k) + ][k]);
- }
- void init1() {
- int T = k * ;
- memset(dir, , sizeof dir);
- sum1[] = ;
- for(int i = ; i <= T; ++i) {
- int s = (g[i].t - g[i - ].t + n) % n;
- sum1[i - ] = sum1[i - ] + g[i-].m - s;
- }
- initRMQ(T, sum1);
- }
- void init2() {
- int T = k * ;
- sum2[] = sum2[T + ] = ;
- for(int i = T; i > ; --i) {
- int s = (g[i].t - g[i - ].t + n) % n;
- sum2[i] = sum2[i + ] + g[i].m - s;
- }
- initRMQ(T, sum2);
- }
- void solve1() {
- for(int i = ; i <= k; ++i) {
- if(sum1[i - ] <= rmq(i, i + k - )) {
- dir[ g[i].t ] = ;
- }
- }
- }
- void solve2() {
- int T = k * ;
- for(int i = T; i > T - k; --i) {
- if(sum2[i + ] <= rmq(i - k + , i)) {
- if(dir[ g[i].t ]) dir[ g[i].t ] = ;
- else dir[ g[i].t ] = ;
- }
- }
- }
- int main() {
- #ifdef LOCAL
- freopen("in.txt", "r", stdin);
- #endif
- int cas = ;
- while(~scanf("%d%d", &n, &k)) {
- if(n == && k == ) break;
- for(int i = ; i <= k; ++i) {
- scanf("%d%d", &g[i].t, &g[i].m);
- }
- sort(g + , g + + k);
- for(int i = ; i <= k; ++i) {
- g[i + k].t = g[i].t;
- g[i + k].m = g[i].m;
- }
- // for(int i = 1; i <= k * 2; ++i) printf("%d %d\n", g[i].t, g[i].m);
- init1();
- solve1();
- init2();
- solve2();
- printf("Case %d: ", cas++);
- for(int i = ; i <= k; ++i) {
- if(dir[ g[i].t ] == ) printf("%d C ", g[i].t);
- if(dir[ g[i].t ] == ) printf("%d CC ", g[i].t);
- if(dir[ g[i].t ] == ) printf("%d CCC ", g[i].t);
- }
- puts("");
- }
- return ;
- }
Gym 100646 F Tanks a Lot RMQ的更多相关文章
- Gym 100646 You’ll be Working on the Railroad dfs
You'll be Working on the Railroad 题目连接: http://codeforces.com/gym/100646/attachments Description Con ...
- Gym 100646 Problem C: LCR 模拟题
Problem C: LCR 题目连接: http://codeforces.com/gym/100646/attachments Description LCR is a simple game f ...
- Gym 100646 Problem E: Su-Su-Sudoku 水题
Problem E: Su-Su-Sudoku/center> 题目连接: http://codeforces.com/gym/100646/attachments Description By ...
- Gym 100637F F. The Pool for Lucky Ones
F. The Pool for Lucky Ones Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- codeforces Gym 100187F F - Doomsday 区间覆盖贪心
F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F ...
- Codeforces gym 100685 F. Flood bfs
F. FloodTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/F Desc ...
- Gym 100637F F. The Pool for Lucky Ones 暴力
F. The Pool for Lucky Ones Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- Codeforces Gym 100513F F. Ilya Muromets 线段树
F. Ilya Muromets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/probl ...
- Codeforces Gym 100513F F. Ilya Muromets 水题
F. Ilya Muromets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/probl ...
随机推荐
- Redis-3.2.6 配置文件中文翻译
############## # 指定配置文件: ################################## INCLUDES ############################### ...
- 在Azure虚拟机上安装VNC
我们知道,Azure提供的linux虚拟机镜像是没有桌面的,是base版的,大多情况下能满足绝大部分工作需要,甚至很多习惯使用命令行的读者,反而用不惯带桌面的linux OS,但是有些情况下,桌面还是 ...
- .NET中的异步
.NET中4种异步方式? ThreadPool.QueueUserworkItem实现 APM模式(就是BeginXXX和EndXXX成对出现.) EAP模式(就是Event based, 准确说来就 ...
- MySQL 磁盘I/O问题
一.使用磁盘阵列:RAID,廉价磁盘冗余阵列,可靠性,性能好. 二.使用 Symbolic Links 分布I/O 利用操作系统的符号链接将不同的数据库或表.索引指向不同的物理磁盘,达到分布磁盘I/O ...
- 项目vue2.0仿外卖APP(三)
项目的结构如下: 项目资源准备 准备项目的各种图片资源等等 注意:在webpack可以不用css sprite,直接用单张图片,因为它会帮忙打包. 还有SVG图片, ...
- python中单引号, 双引号,三引号的差异
1. 单引号和双引号用法都是一样的,但是如果字符串里有相同的字符时要使用\进行转义 举例:1) print 'hello'2) print "hello"1和2,结果都是hello ...
- links and softwares
links 普通 http://www.ncpa-classic.com//special/2014gejujie/index.shtml ; 中国大剧院 http://tieba.baidu.com ...
- PHP 链接多种数据库 的方法
数据库中 单词之间的空格(一个语句前面和后面做字符串拼接的时候最好留空格 ) 可以随便加 其他地方 禁止随便加空格!!(加了 就报错)! =====================总结=== ...
- ASP.NET获取百度地图提供的API接口里面的JSON
思路:开始是想直接在前台获取,但是跨域访问还是有点难度,而且格式必须是josnp格式的,最后嫌麻烦,不得已放弃. 我做的ASP.NET 而这个有自带的解析类,直接引用就行了 先在后台获取到JOSN: ...
- fabric
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # fab test [root@192.168.85.99:22] Executing ...