[CSP-S模拟测试]:Emotional Flutter(贪心)
题目传送门(内部题51)
输入格式
第一行一个整数$t$表示数据组数。
每组数据的第一行有三个整数$s,k,n$。
第二行有$n$个整数$A_1,A_2,...,A_n$,依次表示黑白条的长度。
输出格式
若能通过输出$"TAK"$,否则输出$"NIE"$。
样例
样例输入:
2
2 8 7
2 5 6 3 2 1 2
2 8 4
1 6 7 4
样例输出:
TAK
NIE
数据范围与提示
样例解释:

数据范围:
$30\%$的数据,$n\leqslant 1300$;
$50\%$的数据,$n\leqslant 22,000$;
$100\%$的数据,$2\leqslant n\leqslant 500,000,1\leqslant s<k\leqslant {10}^9,1\leqslant A_i\leqslant {10}^9,1\leqslant t\leqslant 10$。
数据有梯度。输入文件较大请使用读入优化。
题解
其实就是一个贪心,主要是策略很难想。
首先来处理脚的长度,我们可以将所有的黑块都延长$s$,所有的白块左端点向右移动$s$,这样就相当与忽略了脚的长度。
然后会有一些特判的情况,对于我的贪心策略,我们只需要用到当一个黑块长度大于$k$时,肯定跳不过去,所以直接输出$"NIE"$即可。
现在来讲对于一般情况,我是如何判断的。
首先,将所有的黑块的左端点和右端点分别$\mod k$,那么我们是不能在这段区间进行起跳的;如果出现$\mod k$完之后右端点小于左端点,那么区间$[0,r]$和区间$[l,k-1]$是不能起跳的。
之后我们只需要将所有的不能跳的区间排个序,然后我们只需要找到一个可以起跳的点即可。
细节比较多,慢慢调吧……
时间复杂度:$\Theta(n\log n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{long long l,r;}e[10000000];
long long s,k,n;
long long sum[5000001];
long long lft[5000001],rht[5000001],wsq;
int top;
bool flag;
bool cmp(rec a,rec b){return a.l==b.l?a.r<b.r:a.l<b.l;}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&s,&k,&n);
top=flag=wsq=0;
for(int i=1;i<=n;i++)
{
long long a;
scanf("%lld",&a);
if(i&1)a+=s;
else{a-=s;a%=k;}
if(a>k)flag=1;
sum[i]=sum[i-1]+a;
if(i&1)
{
lft[i]=sum[i-1]+1;
rht[i]=sum[i]-1;
}
}
if(((n&1)&&sum[n]<=k)||((!(n&1))&&sum[n-1]<=k)){puts("TAK");continue;}
if(flag){puts("NIE");continue;}
for(int i=1;i<=n;i+=2)
{
lft[0]=lft[i]%k;
rht[0]=rht[i]%k;
if(rht[0]<lft[0])
{
e[++top]=(rec){0,rht[0]};
e[++top]=(rec){lft[0],k-1};
}
else e[++top]=(rec){lft[0],rht[0]};
}
sort(e+1,e+top+1,cmp);
if(e[1].l){puts("TAK");goto nxt;}
for(int i=1;i<=top;i++)
{
if(wsq+1<e[i].l){puts("TAK");goto nxt;}
wsq=max(wsq,e[i].r);
}
if(wsq<k-1){puts("TAK");continue;}
puts("NIE");
nxt:;
}
return 0;
}
rp++
[CSP-S模拟测试]:Emotional Flutter(贪心)的更多相关文章
- csp-s模拟47 Emotional Flutter,Endless Fantasy题解
题面:https://www.cnblogs.com/Juve/articles/11558523.html A:Emotional Flutter 如果起点确定,那么我们后面走的点都是固定的,及mo ...
- [CSP-S模拟测试]:Blue(贪心)
题目描述 $Blue$是个动物学家,不仅喜欢研究猫和老鼠,还喜欢研究青蛙.他最近开始研究青蛙过河的问题,可以简化成:数轴上$0$为岸边,$L$为河对岸.$(0,L)$中间存在$n$个石子.已知青蛙一跳 ...
- [CSP-S模拟测试]:爬(贪心)
题目传送门(内部题134) 输入格式 第一行两个数$N,L$. 接下来$N$行每行两个数$A_i,B_i$. 接下来$N$行每行一个整数$C_i$. 输出格式 一行一个整数表示答案,无解输出$-1$. ...
- [CSP-S模拟测试]:午餐(贪心+最短路)
题目传送门(内部题115) 输入格式 第一行两个正整数$n,m$. 接下来$m$行,每行$4$个正整数$u_j,v_j,L_j,R_j$. 接下来一行$n$个数,若第$i$个数为$1$,则$i$号同学 ...
- [CSP-S模拟测试]:格式化(贪心)
题目传送门(内部题105) 输入格式 每组数据第一行一个正整数$n$,表示硬盘块数,接下来$n$行,每行两个正整数,第一个正整数为硬盘格式化前的容量,第二个正整数为格式化之后的容量. 输出格式 对每组 ...
- [CSP-S模拟测试]:优化(贪心+DP)
题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...
- [CSP-S模拟测试]:梦境(贪心+小根堆)
题目描述 智者奥尔曼曾说过:有缘的人即使相隔海角天涯,也会在梦境中相遇. $IcePrince\text{_}1968$和$IcePrincess\text{_}1968$便是如此.有一天$IcePr ...
- [CSP-S模拟测试]:d(贪心+树状数组)
题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对 ...
- [CSP-S模拟测试]:Tree(贪心)
题目描述 给定一颗$n$个点的树,树边带权,试求一个排列$P$,使下式的值最大 $$\sum \limits_{i=1}^{n-1}maxflow(P_i,P_{i+1})$$ 其中$maxflow( ...
随机推荐
- c#继承与构造函数的调用
1.实例化父类时,可以通过new子类来实例化父类,执行构造函数的顺序为:先执行父类的构造函数,再执行子类的构造函数. 2.实例化子类时,只可以new子类,执行顺序同上. 3.父类实例化后,只能执行父类 ...
- Scala面向对象
面向对象编程OOP: Scala vs Java 都有这三特性 封装:把属性.方法封装到类中 Person: int id, String name, Date birthday.... 需要gett ...
- 设置div标签可以输入文字
1.contenteditable 属性可以设置div标签为克输入标签, 2.input和textarea虽然是常用的输入标签,但是这两个标签不能设置最大高度和最小高度, 随意如果想随着输入的内容 ...
- 洛谷 P3374 【模板】树状数组 1(单点加,区间和)
题目链接 https://www.luogu.org/problemnew/show/P3374 树状数组 树状数组最基本的就是求区间和. 维护: 空间复杂度:O(n) 时间复杂度(区间和,单点修改) ...
- python开发之路-day01
1.Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为A ...
- Codeforces - 1194E - Count The Rectangles - 扫描线
https://codeforc.es/contest/1194/problem/E 给5000条正常的(同方向不会重叠,也不会退化成点的)线段,他们都是平行坐标轴方向的,求能组成多少个矩形. 先进行 ...
- thinkphp开发微信小程序后台流程
thinkphp开发微信小程序后台流程,简单分享一下微信开发流程 1,注册微信小程序账号 2,注册好后,登陆微信小程序,下载微信小程序开发工具 3,用thinkphp开发企业后台,前台数据用json返 ...
- Android关于SurfaceView,SurfaceHolder,SurfaceHolder.CallBack详解
官方的定义: 1.SurfaceView SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸.Surfacev ...
- win10开机出现两个系统
1.cmd(Ctrl+R) 2.输入msconfig 3.选引导 4.删除多余的系统(切记不能删错)
- 93-基于ATOM E3825的3U PXIe 主板控制器
基于ATOM E3825的3U PXIe 主板控制器 一.板卡概述: 本主板采用intel ATOM 处理器 E3825 设计主板控制器,是一种低成本.低功耗解决方案.板卡采用Intel Bay Tr ...