这题的话,我们分析一下,入栈的操作是:

  • 栈空
  • 栈顶元素和当前操作元素不属于同一类括号
  • 栈顶元素和当前操作元素属于同一类括号,但是并不是左括号在前,右括号在后

上面三个条件有任意一个满足都应该入栈,如果三个都不满足,那就弹出栈顶元素,因为这时肯定是匹配的括号。

我们不必考虑栈内究竟是什么情况,我们要考虑的是,每个对应的元素,进行操作之后,栈顶的元素是谁,我们用序号入栈,代替原本的元素。

我们可以知道如果第l个和第r个是合法的,那么第l+1到第r-1也一定是合法的,所以他们就可以相互抵消,那么此时我们之前访问到l的时候,它的栈顶元素和我们抵消之后的栈顶元素师相同的。

因为中间的都消消乐了,所以如果ans[l-1]=ans[r],就输出也yes。它们两个表示的都是,对下标元素进行操作之后的栈顶元素。我们不能对比l,因为如果l入栈,这时ans[l]里面存的是其它值。

#include <stdio.h>
#include <string.h>
const int maxn=1e6+10;
int a[maxn],stack[maxn],ans[maxn]; int main()
{
int top=0,l,r,n,m,q;
memset(ans,0,sizeof(ans));
memset(stack,0,sizeof(stack));
scanf("%d%d%d",&n,&m,&q);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=n;i++) {
if (!top||a[stack[top]]/2!=a[i]/2||a[stack[top]]+1!=a[i])
stack[++top]=i;
else
--top;
ans[i]=stack[top];
}
while (q--) {
scanf("%d%d",&l,&r);
if (ans[l-1]==ans[r])
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

最新文章

  1. [.NET] 怎样使用 async &amp; await 一步步将同步代码转换为异步编程
  2. [Python] python vs cplusplus
  3. $_GLOBALS超全局数组和global定义的全局变量区别?
  4. vs2013 JS代码提示
  5. bzoj3293 [Cqoi2011]分金币&amp;&amp;bzoj1045 [HAOI2008]糖果传递
  6. Javascript Sting(字符串)对象
  7. Spring Boot 定时任务的使用
  8. netcore应用程序部署程序到ubuntu
  9. JavaScript异步并发请求问题
  10. cf954H
  11. leveldb 学习记录(六)SSTable:Block操作
  12. Bashu2445 -- 【网络流24题-10】餐巾问题
  13. java将字符串根据空格进行分割,使用split方法
  14. [转载]RPM中SPEC常用路径以及宏变量
  15. 最好的Java和Android开发IDE---IntelliJ IDEA使用技巧
  16. Struts2的手工自定义验证--完整实例代码
  17. 第10课 C++中的动态内存分配
  18. SQL语句,标准表达式中数据类型不匹配
  19. centos7修改hostname和hosts
  20. eureka -1 - 介绍

热门文章

  1. vant搜索框问题
  2. 始终要覆盖toString
  3. [POJ1463] Strategic game
  4. python中的os.path.dirname与os.path.dirname(__file__)的用法
  5. StretchDIBits速度测试(HALFTONE)
  6. 灰度共生矩阵GLCM分析
  7. I/O————字节流
  8. 学习笔记——Paint 1(MaskFilter)
  9. cacti添加被监控机全过程
  10. jsonwebapi请求头的设置