You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.4 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2000010;
int n;
int p[N];
int d[N];
LL s[N];
bool ans[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d %d", &p[i], &d[i]);
// 破环成链
p[i + n] = p[i];
d[i + n] = d[i];
}
// 顺时针,油量增减量的前缀和
for (int i = 1; i <= 2 * n; i++) s[i] = s[i - 1] + p[i - 1] - d[i - 1];
for (int i = 1; i <= n; i++) { // 枚举出发点
LL Min = LLONG_MAX;
// 找出每个加油站站点到达时的油量最小值,如果最小值都
for (int j = i + 1; j <= i + n; j++) Min = min(Min, s[j]);
if (Min >= s[i]) ans[i] = true;
}
// 逆时针,油量增减量的后缀和
// 一正一反跑两回,才能说某个点是不是顺时针、逆时针可以到达全程,跑环成功
// KAO,前缀和和后缀和一起用居然不用重新初始化这个边界s[i+1]=0用的好啊
// memset(s, 0, sizeof s);
for (int i = 2 * n; i; i--) s[i] = s[i + 1] + p[i + 1] - d[i];
for (int i = n + 1; i <= 2 * n; i++) {
LL Min = LLONG_MAX;
for (int j = i - 1; j >= i - n; j--) Min = min(Min, s[j]);
if (Min >= s[i]) ans[i - n] = true;
}
// 枚举输出
for (int i = 1; i <= n; i++) puts(ans[i] ? "TAK" : "NIE");
return 0;
}