Problem B+

发布时间: 2017年7月1日 02:08   最后更新: 2017年7月1日 02:10   时间限制: 1000ms   内存限制: 64M

描述

给定一个长度为n的序列a1, a2, ..., an, 满足这个序列是一个1~n的排列

如果一个序列满足: 将序列排序后, 任意两个相邻的元素的差为1, 那么就称这个序列为"胖虎序列"

给出q个操作, 操作分为两种

对于形如1 x y的操作, 交换ax和ay, 满足1≤x<y≤n

对于形如2 x y的操作, 判断区间[x,y]内的元素构成的序列是否为一个"胖虎序列", 如果是, 输出"YES", 否则输出"NO", 满足1≤x≤y≤n

9×104≤n≤105, 9×104≤q≤105

输入

第一行两个整数n, q, 意义如上所述。
第二行n个整数, 表示序列a。
接下来q行, 每行第一个数为opt, 之后紧跟两个数, 意义如上所述。

输出

对于每个操作2, 输出答案, 一行一个。

样例输入1 复制

5 3
1 2 4 3 5
2 1 3
1 3 4
2 1 3

样例输出1

NO
YES

这是一道比较有意思的题,题目给出一个1到n的排列,然后两种操作:

(1)交换任何两个数

(2)选取一段连续的区间,并判断能否构成等差数列且 公差为1

判断等差序列的时候,我们先找到这段序列的最小值以及最大值,然后假设其为等差序列,估计出区间和,然后和维护的真实区间和进行比对,如果相等就是等差序列,否则的话,就不是

我们用到的区间求最大值,最小值以及区间和的数据结构都是线段树。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX = 100007;
const int INF = 1e9;
int st[MAX<<2][3];
int a[MAX];
int n,q;
int ops(int a,int b,int op){switch(op){case 0:return max(a,b);case 1:return min(a,b);case 2:return a + b;}
}
void build(int cur,int l,int r,int op){if(l == r) st[cur][op] = a[l];else{int mid = (r + l) /2;build(cur*2,l,mid,op);build(cur*2+1,mid + 1,r,op);st[cur][op] = ops(st[cur*2][op],st[cur*2+1][op],op);}
}
void modify(int cur,int l,int r,int pos,int val,int op){if(l == r) st[cur][op] = val;else{int mid = (l + r)/2;if(pos <= mid) modify(cur*2,l,mid,pos,val,op);else modify(cur*2 + 1,mid + 1,r,pos,val,op);st[cur][op] = ops(st[cur*2][op],st[cur*2+1][op],op);}
}
int query(int cur,int l,int r,int x,int y,int op){if(x <= l && y >= r) return st[cur][op];int mid = (l+r)/2,res = -INF;if(y <= mid) res = query(cur*2,l,mid,x,y,op);else if(x > mid){res = query(cur*2 + 1,mid + 1,r,x,y,op);}else{int ls = query(cur * 2, l, mid, x, y,op); int rs = query(cur * 2 + 1, mid + 1, r, x, y,op); res = ops(ls,rs,op);}return res;
}
int main(){scanf("%d%d",&n,&q);for(int i = 1;i <= n;i++){scanf("%d",&a[i]);}build(1,1,n,0);build(1,1,n,1);build(1,1,n,2);while(q--){int opt,x,y;scanf("%d%d%d",&opt,&x,&y);if(opt == 1){modify(1,1,n,x,a[y],0);modify(1,1,n,x,a[y],1);modify(1,1,n,x,a[y],2);modify(1,1,n,y,a[x],0);modify(1,1,n,y,a[x],1);modify(1,1,n,y,a[x],2);swap(a[x],a[y]);}else{int ma = query(1,1,n,x,y,0);int mi = query(1,1,n,x,y,1);int s = (ma+mi)*(ma-mi+1)/2;if(s == query(1,1,n,x,y,2)){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}}}return 0;
} 

2017西安交大ACM小学期数据结构 [线段树]相关推荐

  1. 2017西安交大ACM小学期数据结构 [又是树状数组、异或]

    Problem F 发布时间: 2017年6月28日 10:31   最后更新: 2017年6月29日 21:35   时间限制: 2000ms   内存限制: 64M 描述 给定一个n×m的矩形, ...

  2. 2017西安交大ACM小学期数据结构 [树状数组 离散化]

    Problem E 发布时间: 2017年6月28日 12:53   最后更新: 2017年6月29日 21:35   时间限制: 1000ms   内存限制: 64M 描述 给定一个长度为n的序列a ...

  3. 2017西安交大ACM小学期数据结构 [树状数组,极大值]

    Problem D 发布时间: 2017年6月28日 10:51   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  4. 2017西安交大ACM小学期数据结构 [树状数组]

    Problem C 发布时间: 2017年6月28日 11:38   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  5. 2017西安交大ACM小学期数据结构 [分块、二维矩阵]

    Problem B 发布时间: 2017年6月28日 10:06   最后更新: 2017年6月28日 16:35   时间限制: 2000ms   内存限制: 32M 描述 给定一个n×m的矩形, ...

  6. 2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]

    Problem A 发布时间: 2017年6月28日 09:29   最后更新: 2017年6月28日 13:03   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  7. 2017西安交大ACM小学期 有趣异或[Trie树]

    有趣异或 发布时间: 2017年7月4日 23:59   最后更新: 2017年7月5日 14:56   时间限制: 1500ms   内存限制: 512M 描述 给定n个非负整数,保证这些数两两不相 ...

  8. 2017西安交大ACM小学期 敏感词汇[AC自动机]

    敏感词汇 发布时间: 2017年7月5日 00:23   最后更新: 2017年7月6日 14:40   时间限制: 1500ms   内存限制: 128M 描述 我们知道,在进行聊天时,有些词汇是敏 ...

  9. 2017西安交大ACM小学期 文本查找[AC自动机]

    文本查找 发布时间: 2017年7月5日 00:10   最后更新: 2017年7月5日 13:47   时间限制: 1500ms   内存限制: 128M 描述 给定m种两两不同的关键词,并给定一段 ...

最新文章

  1. 使用Python,OpenCV确定对象的颜色
  2. HDU2022 海选女主角
  3. DefaultSingletonBeanRegistry源码解析
  4. AT32F415 USART1、2、3,DMA 用结构体统一配置收发
  5. CodeForces - 1102A(思维题)
  6. java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)
  7. Overview of ISA and TMG Networking and ISA Networking Case Study (Part 2)
  8. mysql 测试 缓存_mysql 缓存开启及测试
  9. SSM配置后可以访问静态html文件但无法访问其他后台接口的解决方案
  10. 楼板计算塑形弹性_阶梯教室板模板支架工程方案计算书(仅供参考)
  11. php技术可行性,【可行性报告】网站的PHP实现技术.ppt
  12. 零基础学会数据分析计划
  13. java计算费用类题目
  14. 载硫酸庆大霉素PLGA纳米粒PNPs(GS修饰PLGA纳米粒)/cRGD修饰PLGA纳米粒的制备方法
  15. Excel学习笔记:P10-图表制作(下)
  16. 【逆向学习】花指令的去除
  17. 3GPP TS 23501-g51 中英文对照 | 5.3.3 Connection Management
  18. Spring和WebSocket整合并建立简单的Web聊天室
  19. socket 是用什么网络协议
  20. 英语口语116之每日十句口语

热门文章

  1. ai的预览模式切换_AI字体制作,用AI制作创意阶梯式文字
  2. 共聚焦图片怎么加标尺_聚焦扶贫政策,打造小康生活
  3. 跨越跨域大山,前端不得不知道的Ajax
  4. [mybatis]映射文件_select_resultMap_关联查询
  5. [PAT乙级]1033 旧键盘打字(getline()读入)
  6. C++手写a除以b的正余数
  7. python数组赋值给变量_Python:将数组中的元素导出到变量中 (unpacking)
  8. Spring集成Mybatis错误Result Maps collection already contains value for XXX
  9. Caffe 在自己的数据库上训练步骤
  10. 1847 奇怪的数学题(杜教筛 + Min_25 + 第二类斯特林数)