Codeforces 279C Ladder

本题与tbw这篇博客上的题有相似思路。tbw的本来我还不会,抄了题解才过,这道题好歹自己磕半天磕出来了。到tbw做那道题我突然想明白了,再一想诶跟这里不是一样的嘛,lol。然后就被他逼着过来写题解,痛得一批。

题意

对于一段序列,要求刚开始不能递减,之后不能递增。换言之,只能有一个波峰,不能有波谷,可以是一条平平的线。

俺的思路

来一个数组ndec[],记录某一个点之后的下降点。

再来一个数组ninc[],记录某一个点之后的上升点。

 +-----------------+              +-----------------+
| | | * * |
| * * * | |* * * *|
| * * * *| | * * * * |
|* * | | |
+-----------------+ +-----------------+
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
^ ^ ^ ^ ^
d 5 5 5 5 9 9 9 9 ? i 4 4 4 5 9 9 9 9 ?

注意不管上升、下降是否连续,只要比前一点大就认为是上升点,比前一点小就认为是下降点。

并且一定要记录下一个,不要记自己。

fill0(ninc);
fill0(ndec);
forward(i,2,n){
if(a[i]>a[i-1])ninc[i]=1;
if(a[i]<a[i-1])ndec[i]=1;
}
ll tmpi = INF, tmpd = INF, flagi, flagd;
backward(i,n,1){
flagi = ninc[i];
ninc[i] = tmpi;
if(flagi==1)tmpi=i;
flagd = ndec[i];
ndec[i] = tmpd;
if(flagd==1)tmpd=i;
}

俺已经忘记这都是些什么鬼画符了……

之后怎么判断一个区间是否OK呢?

 +-----------------+              +-----------------+
| | | |
| * * * | | * * *] |
| [* *]* *| | [* * * *|
|* * | |* * |
+-----------------+ +-----------------+
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
d ^ ^ d ^ ^
*-->* *-->*
i ^ ^ ^ i ^ ^ ^
*-->* *-->*
l r ^OK l ^ r NO

我们找l点之后的一个下降点,即ndec[l]。那么从l到这玩意之前都是一段非降序列。

  • 如果ndec[l]\(>\)r,说明lr之间都是非降序列,是合法的。

  • 如果ndec[l]\(\le\)r,说明前半段是非降,那么就要求从ndec[l]开始的后半段非增。直接再往后找一个上升点,即ninc[ndec[l]]

    • 如果ninc[ndec[l]]\(>\)r,类似上面所述,是OK的。

    • 如果ninc[ndec[l]]\(\le\)r,说明上升之后开始下降、结果还没出区间又开始上升了,炸裂。

好像没提到全程非升的情况?比如有a[l+1]\(<\)a[l]

那样ndec[l]\(=\)l+1,就合并到“前半段非降”的情况(前半段指\([l,l]\))

if(ndec[x]>y||ninc[ndec[x]]>y){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}

查询直接干到\(O(1)\)。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define wlf(i,a,b) for(ll i=a;i<=b;++i)
#define tbw(i,a,b) for(ll i=a;i>=b;--i)
#define fill0(b) memset(b,0,sizeof(b))
#define fill1(b) memset(b,-1,sizeof(b))
#define fill3f(b) memset(b,0x3f,sizeof(b))
const ll INF = 0x3f3f3f3f3f3f3f3f; const ll N = 1e5+10;
ll n,m,a[N],ninc[N],ndec[N]; int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
wlf(i,1,n)cin>>a[i];
fill0(ninc);
wlf(i,2,n){
if(a[i]>a[i-1])ninc[i]=1;
if(a[i]<a[i-1])ndec[i]=1;
}
ll tmpi = INF, tmpd = INF, flagi, flagd;
tbw(i,n,1){
flagi = ninc[i];
ninc[i] = tmpi;
if(flagi==1)tmpi=i;
flagd = ndec[i];
ndec[i] = tmpd;
if(flagd==1)tmpd=i;
}
while(m--){
ll x,y;
cin>>x>>y;
if(ndec[x]>y||ninc[ndec[x]]>y){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
return 0;
}

解题报告:Codeforces 279C Ladder的更多相关文章

  1. codeforces --- 279C Ladder

    C. Ladder time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  2. Codeforces 279C - Ladder - [简单DP]

    题目链接:http://codeforces.com/problemset/problem/279/C 题意: 给出 $n$ 个整数 $a[1 \sim n]$,$m$ 个查询,对于一个查询 $[l_ ...

  3. 寒假训练3解题报告 CodeForces #148

    CodeForces 148B 一道简单模拟,判断龙能够抓到公主几次,如果公主和龙同时到达公主的城堡,不算龙抓住她,因为路程除以速度可能会产生浮点数,所以这里考虑一下精度问题 #include < ...

  4. CodeForces 279C Ladder (RMQ + dp)

    题意:给定一个序列,每次一个询问,问某个区间是不是先增再降的. 析:首先先取处理以 i 个数向左能延伸到哪个数,向右能到哪个数,然后每次用RQM来查找最大值,分别向两边延伸,是否是覆盖区间. 代码如下 ...

  5. cf1189解题报告

    cf1189div2解题报告 codeforces A 答案要不是一串要不就是去掉最后一个字母的两串 #include <bits/stdc++.h> #define ll long lo ...

  6. codeforces 476C.Dreamoon and Sums 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...

  7. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  8. Codeforces Round 665 赛后解题报告(暂A-D)

    Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...

  9. Codeforces Round 662 赛后解题报告(A-E2)

    Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

  10. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

随机推荐

  1. 使用 FPM 将源码包转化为rpm包(技巧)

                    使用 FPM  将源码包转化为rpm包 1.支持的源类型包 dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包 rpm: 对rpm进行转换 gem: 对r ...

  2. C++ MFC学习 (二)

    使用向导创建MFC程序 1. 新建-> 选择 MFC -> MFC应用程序 ->下一步 2. 应用程序类型选择     选择单个文档,MFC标准  -> 下一步   3. 下一 ...

  3. redis 5.0.5集群部署与服务器宕机故障模拟

    背景 业务稳定性要求需要一套redis集群来保障 因此采用 redis cluster 集群 环境 名称 ip地址 cpu 内存 master端口 slave端口 redis-651 10.65.6. ...

  4. 2022-05-19内部群每日三题-清辉PMP

    1.项目经理与项目相关方开会,获得关于如何最好地向施工现场输送用品的信息和知识.这使用的是哪种沟通方法类型? A.交互式沟通 B.内部沟通 C.拉式沟通 D.推式沟通 2.一个国际团队被分配到一个项目 ...

  5. SAR成像(四):多普勒频移的计算

    雷达系统中,雷达与目标间的相互运动会使回波信号产生频移,称为多普勒效应,对应的频移称为多普勒频率. 假设雷达发射信号为单频连续波, f ( t ) = c o s ( 2 π f 0 t + ϕ ) ...

  6. WPF 入门教程DispatcherTimer计时器

    在 WinForms 中,有一个名为 Timer 的控件,它可以在给定的时间间隔内重复执行一个操作.WPF 也有这种可能性,但我们有DispatcherTimer控件,而不是不可见的控件.它几乎做同样 ...

  7. Servlet中使用request转发页面引发的500空指针异常

    多余的不说如果你出现了我下面这张图的异常错误,可以继续看下去: 上面的错误是因为我们使用的转发地址错误引起的,这样他转发的地址不存在,则会出现空指针异常. register.jsp在我的Tomcat的 ...

  8. The emulator process for AVD Pixel_4_XL_API_30 was killed 问题

    转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/14946317.html 问题: 因为工作关系接触到了Android Studio,新建了4和11系统的模拟 ...

  9. 读取excel等文件根据注解自动装填为实体类

    问题:以前每次读取excel 都是根据第几列来装填实体类里面的属性.写起来很麻烦.还要判断. 思路: 1.因为每次读取excel 或者word表格 都能得到是第几列的数据,那么可以知道每列数据的ind ...

  10. JWT 工具类的编写

    导入JWT pom依赖 <!--JWT 依赖--><dependency> <groupId>io.jsonwebtoken</groupId> < ...