求大佬帮调(有注释)(马蜂良好)
  • 板块题目总版
  • 楼主yrs2022
  • 当前回复20
  • 已保存回复20
  • 发布时间2023/8/15 17:56
  • 上次更新2023/11/3 03:35:00
查看原帖
求大佬帮调(有注释)(马蜂良好)
721593
yrs2022楼主2023/8/15 17:56

题目

提交记录

#include<bits/stdc++.h>
using namespace std;
const int N = 2000100;
struct node{
	int id,sum;
} q[N][2];//单调队列
int oil[N][2][2], minn[N][2];//oil[点][顺时针/逆时针][加油/耗油],minn[点][顺时针/逆时针]
int sum[N][2],n,len[2],ans[2]={1,1},a,b;//len==tail,ans==head
int main(){
	scanf("%d",&n);
	for(int i = 1;i <= n;i++){
		scanf("%d%d",&a,&b);
		oil[i+n][0][0] = oil[i][0][0] = a;
		oil[i+n][0][1] = oil[i][0][1] = b;
		oil[n-i+1][1][0] = oil[2*n-i+1][1][0] = a;
		oil[n-i][1][1] = oil[2*n-i][1][1] = b;
	}
	for(int i = 1;i <= 2*n;i++){//前缀和表示加油-耗油
		for(int j = 0;j <= 1;j++){
			sum[i][j] = sum[i-1][j]+oil[i][j][0]-oil[i][j][1];
		}
	}
	for(int i = 1;i <= 2*n;i++){//单调队列求最小
		for(int j = 0;j <= 1;j++){
			while(q[ans[j]][j].id<=i-n&&len[j]-ans[j]+1){
				ans[j]++;
			}
			while(len[j]-ans[j]+1&&q[len[j]][j].sum>=sum[i][j]){
				len[j]--;
			}
			q[++len[j]][j].sum = sum[i][j];
			q[len[j]][j].id = i;
			minn[i][j] = q[ans[j]][j].sum;
		}
	}
/*	for(int i = 1;i <= 2*n;i++){
		for(int j = 0;j<= 1;j++){
			printf("%d ",sum[i][j]);
		}
		printf("\n");
	}
	for(int i = 1;i <= 2*n;i++){
		for(int j = 0;j <= 1;j++){
			printf("%d ",minn[i][j]);
		}
		printf("\n");
	}*/
	for(int i = 1;i <= n;i++){
		if(minn[i+n-1][0]-sum[i-1][0]>=0||minn[i+n-1][1]-sum[i-1][1]>=0){
			printf("TAK\n");
			continue;
		}
		printf("NTE\n");
	}
	return 0;
}

帮调,本蒟蒻感谢各位大佬!

2023/8/15 17:56
加载中...