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. 【JS】 +function(){} 作用

    原文地址:https://www.jianshu.com/p/a2666014a280 瞎扯 在JS中,经常会遇到下面这种 代码, 到底 在 function 前面加一个 一元操作符, 有什么作用呢? ...

  2. plugin python was not installed: Cannot download ''

    problem: plugin python was not installed: Cannot download ''........ 1. the first method of resoluti ...

  3. LeetCode刷题笔记-回溯法-组合总和问题

    题目描述: <组合总和问题>给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. cand ...

  4. XDTIC2019招新笔试题 + 官方解答

    腾讯创新俱乐部2019年招新笔试试题   [1] 小宗学长正在努力学习数论,他写下了一个奇怪的算式: \[ 2019^{2018^{2017^{\dots^{2^1}}}} \] 算式的结果一定很大, ...

  5. Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现

    AOP配置 在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP.AOP配置的核心元素为:pointcut,advisor,as ...

  6. idea引入项目下所有文件(ps:包括静态文件夹)

    打开项目的目录结构 点击finish 最后删除目录下多余的src就可以了

  7. 5个CSS3技术实现设计增强

    层叠样式表(css)是Web设计的一种语言,CSS的下一代版本CSS3已经蓄势待发.你是否可望开始使用它们却又不知从何下手呢?虽然还有一些新属性没有得到官方的确认,但是一些浏览器已经开始支持来自CSS ...

  8. ASP.NET MVC easyUI-datagrid 的当前页合计and总合计

    一.HTML代码 <table id="dg" class="easyui-datagrid" style="width: 100%; heig ...

  9. 【模板篇】A* 寻路算法

    上次在做k短路的时候说到了A*, 但是并没有仔细的研究A*寻路, 毕竟k短路中的A*也不怎么标准… A*寻路的过程网上还是有很多的, 讲得也很清楚, 不妨跟着里面的图示自己动手操作一下, 基本一遍就能 ...

  10. sql (6) exists

    SQL中EXISTS的用法 查询所有选修了1号课程的学生的姓名,年龄,性别首先取Student表中的一个元组,然后在SC表中依次找SC.Sno=该元组的So,并且对应的Cno='2',如果存在,则外层 ...