首页 > 其他分享 >奥赛一本通 旅行问题

奥赛一本通 旅行问题

时间:2024-06-15 20:43:45浏览次数:10  
标签:旅行 && 10 一本 NIE 奥赛 front empty TAK

// 旅行问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <deque>
#include <cstring>
using namespace std;

/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1600

原题来自:POI 2004

John 打算驾驶一辆汽车周游一个环形公路。公路上总共有 n
 车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。
 John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。
 在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上
 (起点站亦是如此),行驶过程中不能出现没有油的情况。

任务:判断以每个车站为起点能否按条件成功周游一周。

【输入】
第一行是一个整数 n,表示环形公路上的车站数;

接下来 n行,每行两个整数 pi,di,
 分别表示表示第 i号车站的存油量和第 i号车站到下一站的距离。

【输出】
输出共 n行,如果从第 i 号车站出发,一直按顺时针(或逆时针)方向行驶,
能够成功周游一圈,则在第 i行输出 TAK,否则输出 NIE。

【输入样例】
5
3 1
1 2
5 2
0 1
5 4


【输出样例】
TAK
NIE
TAK
NIE
TAK



//======================================
10
10 1
5 0
14 7
18 9
7 6
0 3
6 8
17 3
18 9
19 7

TAK
TAK
TAK
TAK
NIE
NIE
NIE
TAK
TAK
TAK
//========================
10
5 6
6 1
12 7
10 2
14 1
9 9
10 1
12 2
15 3
3 1

TAK
TAK
TAK
TAK
TAK
TAK
TAK
TAK
TAK
TAK


数据范围与提示:

对于全部数据,3≤n≤10^6,0≤pi≤2×10^9,0<di≤2×10^9。
*/
int n;
const int N = 3000010;
long long a[N];
int p[N], d[N];

//long long pre[N];
int ans1[N];
int ans2[N];


void solve1() {
	memset(ans1, -1, sizeof ans1);
	memset(a, 0, sizeof a);
	for (int i = 1; i <= n; i++) {
		a[i] = p[i] - d[i];
	}
	//化环成链
	memcpy(&a[n + 1], &a[1], sizeof(a[0]) * n);
	for (int i = 1; i <= n + n; i++) {
		a[i] += a[i - 1];
	}
	deque<int> q;
	for (int i = 2 * n; i >= 0; i--) {
		while (!q.empty() && q.front() - i > n ) q.pop_front();
		while (!q.empty() && a[q.back()] >= a[i]) q.pop_back();
		if (i < n) {
			if (!q.empty() && a[q.front()] < a[i]) {
				ans1[i+1] = q.front();
			}
		}
		q.push_back(i);
	}

}


void solve2() {
	memset(ans2, -1, sizeof ans2);
	memset(a, 0, sizeof a);
	d[0] = d[n];
	for (int i = n; i >= 1; i--) {
		a[n-i+1] = p[i] - d[i - 1];
	}
	//化环成链
	memcpy(&a[n + 1], &a[1], sizeof(a[0]) * n);
	for (int i = 1; i <= n + n; i++) {
		a[i] += a[i - 1];
	}

	deque<int> q;
	for (int i = 2 * n; i >= 0; i--) {
		while (!q.empty() && q.front() - i > n) q.pop_front();
		while (!q.empty() && a[q.back()] >= a[i]) q.pop_back();
		if (i < n) {
			int realid = n - i;
			if (!q.empty() && a[q.front()] < a[i]) {
				//ans1[i + 1] = q.front();
				if (ans1[realid] != -1) {
					//cout << "NIE" << endl;
					printf("NIE\n");
				}
				else {
					//cout << "TAK" << endl;
					printf("TAK\n");
				}
			}
			else {
				//cout << "TAK" << endl;
				printf("TAK\n");
			}
		}
		q.push_back(i);
	}

}


int main()
{
	/*ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);*/
	//cin >> n;
	scanf("%d",&n);
	for (int i = 1; i <= n; i++) {
		//cin >> p[i] >> d[i];
		scanf("%d%d", &p[i], &d[i]);
	}
	
	solve1();
	solve2();
	
	return 0;
}

 

标签:旅行,&&,10,一本,NIE,奥赛,front,empty,TAK
From: https://www.cnblogs.com/itdef/p/18249706

相关文章

  • 《如何有效阅读一本书》读书笔记
    信息《如何有效阅读一本书》奥野宣之江西人民出版社摘录读书笔记的作用:随想笔记、购书清单、各种报道的剪报、读书笔记过程中基本上是用不到笔记本的,读书时只需要画出重点做好记号,日后只需要确认想要落实的内容,记在读书笔记里就好读书的过程:选书、购书、读书、笔记、活用......
  • Jmeter 性能接口一本通
    前言学习Jmeter接口自动化的难点在于场景设计和模块间的组合使用,因此实际操作过程中我们会遇到过很多难以解决的问题。本书既是对jmeter知识框架的一个总结,也是为了方便大家更好的学习使用它。从jmeter基础介绍入手,逐级深入,一直延伸到接口自动化持续集成框架和DDT数据驱动......
  • 这3本救急神刊,录用率超80%!最后一本简直“封神”!
    【欧亚科睿学术】期刊信息JOURNAL经管社科类SSCI(录用率高,ABS一星)【期刊简介】IF:3.0-4.0,JCR2区,中科院3区【出版社】SPRINGER出版社【版面情况】正刊,仅10篇版面【检索情况】SSCI在检,ABS一星【终审周期】预计3个月左右录用【征稿领域】经管创新在各个领域中的应用,包括......
  • [DP] [倍增优化] Luogu P1081 [NOIP2012 提高组] 开车旅行
    [NOIP2012提高组]开车旅行题目描述小\(\text{A}\)和小\(\text{B}\)决定利用假期外出旅行,他们将想去的城市从$1$到\(n\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为\(h_i\),城市\(i\)和城市\(j\)之间的距......
  • 【旅行使身体和灵魂都在路上】智慧旅游解决方案集合推荐,干货满满!
    引言:2024年端午节假期,全国文化和旅游市场总体平稳有序。据测算,全国国内旅游出游合计1.1亿人次,同比增长6.3%;国内游客出游总花费403.5亿元,同比增长8.1%。假期中,群众赛龙舟、吃粽子、唱山歌、赏古曲,传统节日文化内涵与旅游发展深度融合。广东、湖南、浙江、贵州、云南等地......
  • LibreOJ #10131. 「一本通 4.4 例 2」暗的连锁 题解 树上差分
    暗的连锁题目描述Dark是一张无向图,图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark有N−1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark还有M条附加边。你的任务是把Dark斩为不连通的两部分。一开始Da......
  • 信息学奥赛一本通第1022题
    1022:整型与布尔型的转换【题目描述】将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?【输入】一个整型范围内的整数,即初始时整型变量的值。【输出】一个整数,经过上述过程后得到的结果。【输入样例】3【输出样例】1......
  • C++题解——3320——竞选总统(信息学奥赛一本通)
    题目描述:小明想当Y国的总统,Y国大选是按各州的投票结果来确定最终的结果的,如果得到超过一半的州的支持就可以当选,而每个州的投票结果又是由该州选民投票产生的,如果某个州超过一半的选民支持小明,则他将赢得该州的支持。现在给出每个州的选民人数,请问小明至少需要赢得多少选民的......
  • 开车旅行|倍增优化dp+双端列表/set|题解
    题面:题面链接这题的思路值得借鉴,也是我做的第一道倍增优化dp题目.比较好的是题目的意思较为清晰,所以不再赘述.解析:这里我们可以非常直接的想到暴力模拟,因为第一眼看上去前七个点的数据范围是支持我们进行一个简单的预处理得到对应人在对应位置的决策的.(排序O(n×sqrt(......
  • 信息奥赛练习——3360相邻数之和
    【题目描述】请你编程求出二维数组中某点的相邻数之和。相邻数是指与该点邻接的 88 个元素,若该点在边角位置,则邻接元素相应减少。下图以 44 行 55 列二维数组 a为例:a[2][3]元素的值为 77,其邻接元素为 8,9,10,5,8,6,8,08,9,10,5,8,6,8,0 和为 5454 。再比如:a[1]......