40 pts 玄关 ! ! !求调
查看原帖
40 pts 玄关 ! ! !求调
648756
Shadow_Lord楼主2023/9/15 07:38
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
inline int read()
{
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s*w;
}
int n,q[N<<1],a[N],s[N<<1][2],l,r;
bool vis[N];
signed main()
{
	n=read();
	for(int i=1;i<=n;i++)a[i]=read()-read(),s[i][0]=s[i-1][0]+a[i];
	for(int i=n+1;i<=(n<<1);i++)s[i][0]=s[i-1][0]+a[i-n];
	for(int i=(n<<1);i>=n+1;i--)s[i][1]=s[i+1][1]+a[i-n];
	for(int i=n;i>=1;i--)s[i][1]=s[i+1][1]+a[i];
	l=1;r=0;
	for(int i=1;i<n;i++)
	{
		while(l<=r&&s[q[r]][0]>=s[i][0])r--;
		q[++r]=i;
	}
	for(int i=n;i<(n<<1);i++)
	{
		while(l<=r&&i-q[l]+1>n)l++;
		while(l<=r&&s[q[r]][0]>=s[i][0])r--;
		q[++r]=i;
		if(s[q[l]][0]-s[i-n][0]>=0)
		{
			vis[i-n+1]=1;
		}
	}
	l=1;r=0;
	for(int i=(n<<1);i>n+1;i--)
	{
		while(l<=r&&s[q[r]][1]>=s[i][1])r--;
		q[++r]=i;
	}
	for(int i=n+1;i>1;i--)
	{
		while(l<=r&&q[l]-i+1>n)l++;
		while(l<=r&&s[q[r]][1]>=s[i][1])r--;
		q[++r]=i;
		if(s[q[l]][1]-s[i+n][1]>=0)vis[i-1]=1;
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i])cout<<"TAK\n";
		else cout<<"NIE\n";
	}
	return 0;
}
2023/9/15 07:38
加载中...