#10178. 「一本通 5.5 例 4」旅行问题 #10178. 「一本通 5.5 例 4」
ac代码:
#include<iostream>
#define ll long long
using namespace std;
const int N=3000100;
ll a[N],b[N];
ll s[N],q[N];
ll f[N];
int n;
void solve1(){
int h=0,t=-1;
for(int i=1;i<=n;i++){
while(h<=t&&s[i]<=s[q[t]]) t--;
q[++t]=i;
}
for(int i=1;i<=n;i++){
if(h<=t&&q[h]<i) h++;
if(s[q[h]]>=s[i-1]) f[i]=1;
// printf("i=%d q[h]=%d s[q[h]]=%d\n",i,q[h],s[q[h]]);
while(h<=t&&s[i+n]<=s[q[t]]) t--;
q[++t]=i+n;
}
}
void solve2(){
int h=0,t=-1;
for(int i=1;i<=n;i++){
while(h<=t&&s[i]<=s[q[t]]) t--;
q[++t]=i;
}
if(s[q[h]]>=0) f[1]=1;
while(h<=t&&s[1+n]<=s[q[t]]) t--;
q[++t]=1+n;
for(int i=2;i<=n;i++){
if(h<=t&&q[h]<i) h++;
if(s[q[h]]>=s[i-1]) f[n+2-i]=1;
// printf("i=%d q[h]=%d s[q[h]]=%d\n",i,q[h],s[q[h]]);
while(h<=t&&s[i+n]<=s[q[t]]) t--;
q[++t]=i+n;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld%lld",&a[i],&b[i]);
a[i+n]=a[i],b[i+n]=b[i];
}
for(int i=1;i<=2*n;i++){
s[i]=a[i]-b[i];
s[i]+=s[i-1];
}
// for(int i=1;i<=2*n;i++)
// printf(" %d",s[i]);
// printf("\n");
solve1();
s[1]=a[1]-b[n];
s[n+1]=s[1];
for(int i=2;i<=n;i++){
s[i]=a[n+2-i]-b[n+1-i];
s[i+n]=s[i];
s[i]+=s[i-1];
}
for(int i=n+1;i<=2*n;i++)
s[i]+=s[i-1];
// for(int i=1;i<=2*n;i++)
// printf(" %d",s[i]);
// printf("\n");
solve2();
for(int i=1;i<=n;i++){
if(f[i]) printf("TAK\n");
else printf("NIE\n");
}
return 0;
}