正题

题目链接:https://jzoj.net/senior/#main/show/3236


题目大意

一个序列两个操作

  • 1XY:1\ X\ Y:1 X Y:交换XXX和YYY两个数
  • 2AB:2\ A\ B:2 A B:询问A∼BA\sim BA∼B这些数再序列中是否是连续的一段区间(不一定按顺序)

解题思路

先不考虑交换,对于询问我们发现它询问的区间不固定所以很难用线段树来做。所以我们可以用域值iii维护iii再目前序列的哪个位置。然后维护区间最大值和最小值,然后若询问B−AB-AB−A等于A∼BA\sim BA∼B这个区间的maxn−minnmaxn-minnmaxn−minn那么这些是一个连续区间。

然后交换我们定义segiseg_isegi​表示在iii这个位置的数,然后就直接根据这个修改线段树然后交换。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=201000;
int n,m,id[N],seg[N],rea,rei;
struct Tree_node{int l,r,mins,maxs;
};
struct Seg_Tree{Tree_node t[N<<2];void Updata(int x,int ls,int rs){t[x].mins=min(t[ls].mins,t[rs].mins);t[x].maxs=max(t[ls].maxs,t[rs].maxs);return;}void Build(int x,int l,int r){t[x].l=l;t[x].r=r;if(l==r){t[x].mins=t[x].maxs=id[l];return;}int mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);Updata(x,x*2,x*2+1);}void Ask(int x,int l,int r){if(t[x].l==l&&t[x].r==r){Updata(0,0,x);return;}if(r<=t[x*2].r) Ask(x*2,l,r);else if(l>=t[x*2+1].l) Ask(x*2+1,l,r);else Ask(x*2,l,t[x*2].r),Ask(x*2+1,t[x*2+1].l,r);}void Change(int x,int pos,int z){if(t[x].l==t[x].r){t[x].mins=t[x].maxs=z;return;}if(pos<=t[x*2].r) Change(x*2,pos,z);else Change(x*2+1,pos,z);Updata(x,x*2,x*2+1);}
}Tree;
void Query(int l,int r)
{Tree.t[0].mins=n+1;Tree.t[0].maxs=0;Tree.Ask(1,l,r);rei=Tree.t[0].mins;rea=Tree.t[0].maxs;
}
void Swap(int x,int y)
{Query(x,x);int a1=rei;Query(y,y);int a2=rei;Tree.Change(1,x,a2);Tree.Change(1,y,a1);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int x;scanf("%d",&x);id[x]=i;seg[i]=x;}Tree.Build(1,1,n);while(m--){int op,x,y;scanf("%d%d%d",&op,&x,&y);if(op==1){Swap(seg[x],seg[y]);swap(seg[x],seg[y]);}else{Query(x,y);if(rea-rei==y-x) printf("YES\n");else printf("NO\n");}}
}

jzoj3236-矮人排队【权值线段树】相关推荐

  1. 洛谷 P1774 最接近神的人(权值线段树+离散化)

    根据贪心,每次都要交换两个逆序对,所以这个题目就是求逆序对的个数 利用权值线段树来动态加点,每次询问找区间内 [id+1,n] 的所有数的个数,由于取值线段树本身具有顺序,所以可以将区间查询变为单点查 ...

  2. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  3. 【BZOJ-28921171】强袭作战大sz的游戏 权值线段树+单调队列+标记永久化+DP...

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MB Submit: 45  Solved: 30 [Submit][Status][Discuss] ...

  4. P3960-列队【权值线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3960 题目大意 n∗mn*mn∗m的队列,起初站在第(i,j)(i,j)(i,j)位置的人编号是(i−1)∗n+ ...

  5. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  6. 51Nod 1494 选举拉票(权值线段树)

    http://www.51nod.com/Challenge/Problem.html#!#problemId=1494 题解 一开始有start个人投自己,num表示当前已经收买了多少人,从大到小枚 ...

  7. 【BZOJ2653】middle,主席树(非权值线段树)维护序列和信息+二分答案

    传送门 写在前面:虽然这是一道我再也不想写的题目,但很好很有价值 思路: cxlove大神: 要求中位数最大,首先二分中位数,然后判断可行不可行. 判断X可行不可行,对于区间内的数,凡是>=X的 ...

  8. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  9. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  10. codevs1688 求逆序对(权值线段树)

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Description 给定一个序列a1,a2,-,an,如 ...

最新文章

  1. c# 数据可视化_#OpenVisConf上的22位数据可视化从业者的10点收获
  2. Elasticsearch创建雇员目录
  3. 华为云桌面客户端_入冬第一场技术盛宴!DevRun开发者沙龙华为云武汉专场举办...
  4. 这年头连人用脑机接口信号都能无线传输了,瘫痪者可在家轻松上网看视频
  5. CentOS 7安装 ifconfig 管理命令
  6. 机器学习常见知识点自查50问与答
  7. mysql buffer size_mysql中join_buffer_size的建议最大值是多少?
  8. 《Java学习指南》—— 1.4 设计安全
  9. java UCnter 单点登录 对接。
  10. 深入理解OracleExadata
  11. WPS显示无法创建对象,请确认对象已在系统注册表中注册
  12. 寒假第一周 总结与反思
  13. MySQL5.7源码在MacOS+Clion上的单步调试
  14. MATLAB 3d实时,MATLAB 3D 动画制作(三)- 实时随动3D动画设计
  15. 河北省对口升学计算机专业学校,河北省对口升学计算机专业试题详解
  16. 华为网络设备综合配置实验
  17. How2jcn全站百度云
  18. 通过改变电脑的某些设置来呵护我们的眼睛
  19. Python发送163邮箱跳坑指南
  20. kill -9 进程 杀掉僵死进程

热门文章

  1. c++与java,有什么区别?
  2. linux raw设备格式化,SUSE Linux 10配置裸设备(raw devices)
  3. java 最好 入门_C++和Java哪个比较好入门?初学者该如何选择?
  4. 2020年python2停止更新_Python核心团队计划2020年停止支持Python2,NumPy宣布停止支持计划表...
  5. react 版权问题_react使用fetch封装请求的方法-简单易懂
  6. 用keil怎么擦除_分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入
  7. python小游戏——21点
  8. mysql mysqladmin 介绍_Mysql—mysqladmin 命令详解
  9. [Java基础]模块化概述
  10. LeetCode 142环形链表||-中等