jzoj5832 Emotional Flutter 乱搞

38 篇文章 0 订阅

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值