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】矮人排队的更多相关文章

  1. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  2. BZOJ3174 Tjoi2013 拯救小矮人(贪心+DP)

    传送门 Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个 ...

  3. 2075 yh女朋友的危机、2544 拯救小矮人

    Codevs2075和2544是一道题,直接A过. 2075 yh女朋友的危机  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果   ...

  4. bzoj3174 [Tjoi2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  5. [TJOI 2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  6. bzoj 3174: [Tjoi2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  7. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  8. 【BZOJ3174】[TJOI2013]拯救小矮人(贪心,动态规划)

    [BZOJ3174][TJOI2013]拯救小矮人(贪心,动态规划) 题面 BZOJ 洛谷 题解 我们定义一个小矮人的\(A_i+B_i\)为它的逃跑能力. 我们发现,如果有两个小矮人\(x,y\), ...

  9. BZOJ 3174 拯救小矮人(贪心+DP)

    题意 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚到肩 ...

随机推荐

  1. 【72. 编辑距离】【困难】【线性DP】

    给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输 ...

  2. docker集群管理之swarm

    一.简介 docker集群管理工具有swarm.k8s.mesos等,我所用到的是swarm和k8s,这篇文章主要介绍swarm:swarm是docker集成的原生 管理工具,只要你安装上docker ...

  3. DLL相关下断点

    加载DLL 的时候断: sxe ld:[dll] 卸载DLL 的时候断: sxe ud:[dll] 比如: sxe ld:wininet.dll  (在wininet.dll 被装载的时候断点) 这里 ...

  4. SonarQube代码质量扫描持续集成

    1.安装JDK和配置JAVA_HOME和CLASSPATH 2.安装mysql数据库 3.创建数据库和用户 mysql -u root -p mysql> CREATE DATABASE son ...

  5. dev设置子窗体的初始位置,grid控件表头的属性设置

    当在父窗体上弹出子窗体时,一般设置子窗体的初始位置是居中, //在需要展示子窗体的父窗体上写这段,注意必须设置在show方法之前Form2 f2 = new Form2(); f2.MdiParent ...

  6. 关于用Linux桌面版当工作系统这件事

    Linux稳定性好,Linux软件开放--不过等到决定把Linux当作日常工作用系统时,就一言难尽了-- 我日常工作的需求有: 笔记本扩展屏幕 Golang开发 docker/kubernetes 输 ...

  7. [转]Redis实现缓存,你应该懂的哪些思路!

    场景一:类似于微博,实现关注和被关注功能. 思路: 对每个用户使用两个集合类型键,用来存储关注别人的用户和被该用户关注的用户.当用户A关注用户B的时候,执行两步操作: sadd user:A B sa ...

  8. 关于DB9一些信号的缩写

    https://www.cnblogs.com/CCJVL/archive/2010/02/04/1663565.html 场景:PCB板子与PC通过RS232连接,以下信号的方向相对于PCB板子而言 ...

  9. mySql搜索引擎

    转载自 深入浅出mysql数据库 MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表. 若要修改默认引擎,可以修改配置文件中的def ...

  10. Json数据交换一Jackson

    依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>ja ...