Description
中二少年cenbo幻想自己有Eternal Feather。他认为自己的走的每一步都是一次Emotional Flutter。
现在cenbo要走过一条斑马线,斑马线是由n条交替的黑条和白条构成的,第一条是黑条。cenbo脚的长度是s。cenbo要求在走的过程中,他脚的任何一部分都不能碰到象征邪恶的黑条。第一条之前和第n条之后的部分都是白色的,cenbo可以任意选择第一条之前的位置出发。但出发位置一旦选定,之后cenbo的每一步的长度都必须是k。请你判断cenbo有没有可能在不碰到黑条的情况下通过斑马线,即走到第n条之后。
30%的数据,n<=1300;
50%的数据,n<=22000;
100%的数据,2<=n<=500000, 1<=s
Solution
选手没有梦想,略过了这道水题
注意到如果区间[l,r]不能走,那么[l%k,r%k]也不能走
那么我们可以把所有黑色区间映射到[0,k-1]上,求一段最长的白色区间即可
我好菜啊
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define fi first
#define se second
typedef std:: pair <int,int> pair;
const int N=600005;
pair t[N];
int a[N];
int read() {
int x=0,v=1; char ch=getchar();
for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
return x*v;
}
void solve() {
int s=read(),k=read(),n=read();
int sum=0,tot=0; bool flag=true;
rep(i,1,n) a[i]=read();
rep(i,1,n) {
sum+=a[i];
if (i&1) {
if (a[i]>=k) flag=false;
int l=sum-a[i],r=sum-1;
sum%=k;
if ((l/k)<(r/k)) {
t[++tot]=pair(l%k,k-1);
t[++tot]=pair(0,r%k);
} else t[++tot]=pair(l%k,r%k);
}
}
std:: sort(t+1,t+tot+1);
int ans=0,j=-1;
for (int i=1;i<=tot;i++) {
ans=std:: max(t[i].fi-j-1,ans);
j=std:: max(j,t[i].se);
}
ans=std:: max(t[1].fi+k-1-j,ans);
(ans>=s&&flag)?puts("TAK"):puts("NIE");
}
int main(void) {
freopen("emotional.in","r",stdin);
// freopen("emotional.out","w",stdout);
for (int T=read();T--;) solve();
return 0;
}