蒟蒻90pts有注释求助
查看原帖
蒟蒻90pts有注释求助
195331
Mine_KingCattleya楼主2021/9/25 15:58

Rt,#7 第二行应输出 NIE,但我输出 TAK,不知道为啥,有大佬帮忙调一下吗思路是单调队列,和题解里差不多。

#include<deque>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
int n, p[1000005], d[1000005];//如题目所述
int a[2000005];
bool ans[2000005], res[2000005];//ans表示正走的结果,res表示反走的结果
//true表示不能走完,false表示能够走完
deque<int>q;//单调队列
signed main()
{
	scanf("%lld", &n);
	for(int i = 1; i <= n; i++) scanf("%lld%lld", &p[i], &d[i]), a[i] = a[i + n] = p[i] - d[i];//表示如果从这个点出发走到下一个点剩下的油量
	for(int i = 1; i <= 2 * n; i++) a[i] = a[i - 1] + a[i];//求前缀和
	for(int i = 2 * n; i >= 0; i--)//取到0是为了更新1的答案
	{
		while(!q.empty() && a[q.back()] > a[i]) q.pop_back();//把大的扔掉
		if(!q.empty() && q.front() - i + 1 > n) q.pop_front();//把n个之前的扔掉
		if(!q.empty() && a[q.front()] < a[i]) ans[(i + 1) %n] = true;//不为空代表有小于等于他的,a[q.front()]是最小的一个,如果比a[i]小说明不可行,否则说明没有比a[i]小的。
		//因为是要对于每个x做到a[y]-a[x-1]>=0,所以i更新i+1的答案。	
		q.push_back(i);
	}
	while(!q.empty()) q.pop_back();//清空单调队列
	a[1] = a[n + 1] = p[1] - d[n];
	for(int i = 2; i <= n; i++) a[i] = a[i + n] = p[i] - d[i - 1];
	//反着走,i的油量是p[i],路程是d[i-1]
	for(int i = 2 * n; i >= 1; i--) a[i] = a[i + 1] + a[i];
	for(int i = 1; i <= 2 * n + 1; i++)//取到2n+1是为了更新n的答案
	{
		while(!q.empty() && a[q.back()] > a[i]) q.pop_back();
		if(!q.empty() && i - q.front() + 1 > n) q.pop_front();
		if(!q.empty() && a[q.front()] < a[i]) res[(i - 1) % n] = true;
		q.push_back(i);
	}
	// for(int i = 1; i <= n; i++) printf("%d %d\n", ans[i], res[i]);
	for(int i = 1; i < n; i++)
		if(res[i] == false || ans[i] == false) puts("TAK");
		else puts("NIE");
	if(res[0] == false || ans[0] == false) puts("TAK");
	else puts("NIE");
	//特判,因为n%n=0,所以n的答案存在ans[0]和res[0]
	return 0;
}
2021/9/25 15:58
加载中...