【JZOJ3236】矮人排队
description
在七山七海之外的一个小村庄,白雪公主与N个矮人住在一起,所有时间都花在吃和玩League of Legend游戏。白雪公主决心终结这样的生活,所以为他们举办了体育课。 在每节课开始时,矮人必须按他们的身高站队。假定矮人们有高度1,2,...,N(每个人高度互不相同)。然而,由于不健康的生活方式,矮人的智力有所恶化,所以他们没有能力依照自己的高度排序。
因此,白雪公主发出以下形式命令帮助他们:
1 X Y:X和Y位置的矮人互换位置。
2 A B:询问高度为A,A+1,..., B的矮人(不一定是按照这个顺序)是否已形成了当前队列的连续子序列。
帮助矮人按照白雪公主的指示行动,并回答她的问题。
analysis
裸的线段树
线段树叶子节点下标储存该节点高度的人的位置
查询一段高度即查询该区间内位置编号最大与最小的差是否为区间大小
打得有点丑,但跑的快
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 200005
#define reg register int
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
using namespace std;
int mn[MAXN*4],mx[MAXN*4],val[MAXN*4];
int a[MAXN],b[MAXN],c[MAXN];
int n,m;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline void build(int t,int l,int r)
{
if (l==r)
{
mn[t]=mx[t]=val[t]=b[l];
return;
}
int mid=(l+r)>>1;
build(t<<1,l,mid),build((t<<1)+1,mid+1,r);
mn[t]=min(mn[t<<1],mn[(t<<1)+1]);
mx[t]=max(mx[t<<1],mx[(t<<1)+1]);
}
inline int query_max(int t,int l,int r,int x,int y)
{
if (l==x && y==r)return mx[t];
int mid=(l+r)>>1;
if (y<=mid)return query_max(t<<1,l,mid,x,y);
else if (x>mid)return query_max((t<<1)+1,mid+1,r,x,y);
else return max(query_max(t<<1,l,mid,x,mid),query_max((t<<1)+1,mid+1,r,mid+1,y));
}
inline int query_min(int t,int l,int r,int x,int y)
{
if (l==x && y==r)return mn[t];
int mid=(l+r)>>1;
if (y<=mid)return query_min(t<<1,l,mid,x,y);
else if (x>mid)return query_min((t<<1)+1,mid+1,r,x,y);
else return min(query_min(t<<1,l,mid,x,mid),query_min((t<<1)+1,mid+1,r,mid+1,y));
}
inline int query_pos(int t,int l,int r,int x)
{
if (l==r)return t;
int mid=(l+r)>>1;
if (x<=mid)return query_pos(t<<1,l,mid,x);
else return query_pos((t<<1)+1,mid+1,r,x);
}
int main()
{
//freopen("T1.txt","r",stdin);
n=read(),m=read();
fo(i,1,n)a[i]=read(),b[a[i]]=i;
build(1,1,n);
while (m--)
{
int z=read(),x=read(),y=read();
if (z==1)
{
int xx=a[x],yy=a[y];
swap(a[x],a[y]);
int tmpx=query_pos(1,1,n,xx),tmpy=query_pos(1,1,n,yy);
swap(val[tmpx],val[tmpy]);
mx[tmpx]=mn[tmpx]=val[tmpx],mx[tmpy]=mn[tmpy]=val[tmpy];
tmpx>>=1,tmpy>>=1;
while (tmpx)mx[tmpx]=max(mx[tmpx<<1],mx[(tmpx<<1)+1]),mn[tmpx]=min(mn[tmpx<<1],mn[(tmpx<<1)+1]),tmpx>>=1;
while (tmpy)mx[tmpy]=max(mx[tmpy<<1],mx[(tmpy<<1)+1]),mn[tmpy]=min(mn[tmpy<<1],mn[(tmpy<<1)+1]),tmpy>>=1;
}
else
{
int tmpx=query_min(1,1,n,x,y),tmpy=query_max(1,1,n,x,y);
printf(tmpy-tmpx+1==y-x+1?"YES\n":"NO\n");
}
}
return 0;
}
【JZOJ3236】矮人排队的更多相关文章
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- BZOJ3174 Tjoi2013 拯救小矮人(贪心+DP)
传送门 Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个 ...
- 2075 yh女朋友的危机、2544 拯救小矮人
Codevs2075和2544是一道题,直接A过. 2075 yh女朋友的危机 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 ...
- bzoj3174 [Tjoi2013]拯救小矮人
Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...
- [TJOI 2013]拯救小矮人
Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...
- bzoj 3174: [Tjoi2013]拯救小矮人
Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 【BZOJ3174】[TJOI2013]拯救小矮人(贪心,动态规划)
[BZOJ3174][TJOI2013]拯救小矮人(贪心,动态规划) 题面 BZOJ 洛谷 题解 我们定义一个小矮人的\(A_i+B_i\)为它的逃跑能力. 我们发现,如果有两个小矮人\(x,y\), ...
- BZOJ 3174 拯救小矮人(贪心+DP)
题意 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚到肩 ...
随机推荐
- web应用本质
web应用的本质 在之前学习的socket网络编程中,是基于: 架构:C/S架构 协议:TCP/UDP协议 运行在OSI七层模型中的传输层 那么在web应用中,是基于: 架构:B/S架构 协议:Htt ...
- C++ vector操作--往列表中添加或更新内容
有个列表,往里面添加内容,如果对象已存在,只更新其属性,否则添加新一项. #include <iostream> #include <string> #include < ...
- 深度探索C++对象模型之第一章:关于对象之关键词所引起的差异
————如果不是为了努力维护与C之间的兼容性,C++远比现在简单的多. 如果一个程序员渴望学习C++,但是他却发现书中没有熟悉的struct,一定会苦恼,将这个主题包含到C++里,可以提供语言转移时的 ...
- PHP之最长回文串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...
- MySQL安装pdf介绍
pdf地址:https://files.cnblogs.com/files/pygo/mysql%E5%AE%89%E8%A3%85.pdf
- 10月23日——作业1——while循环练习
while循环'''此类编程题,注意带进去试一试1.九九乘法表row=1while row<=9: col=1 while col<=row: print(col,"*" ...
- 基于VUE利用pdf.js实现文件流形式的pdf显示
首先推荐大家看一下这个demo vue-pdf.js-demo,这里面包含固定本地地址,远程pdf地址,通过打开文件的方式打开pdf 这儿我们着重介绍一下通过文件流的形式打开pdf.(所谓文件流,就是 ...
- 贪心+MST——cf1095F
开始看错求最短路了.. 但是MST的思路和最短路也差不多 就是先不考虑特殊边,用最小点做一个生成树 然后加入特殊边,进行一次krus即可 #include<bits/stdc++.h> # ...
- MySQL 知识点随记
1.存储过程中声明变量要在程序的最前面,也要在声明事务开始的前,不然会报错 2.Mysql 获取32位guid: REPLACE(UUID(),"-","") ...
- duilib教程之duilib入门简明教程17.事件处理和消息响应
界面的显示方面就都讲完啦,下面来介绍下控件的响应. 前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEGIN_ME ...