【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)
题意 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚到肩 ...
随机推荐
- seo具备的条件
对于SEO这行业,许多想学习这一行,但是并非每一个人都有这样才能.因为SEO份这行靠是真材实料并非虚拟人才.现在找到高工资的SEO人才需要 有三年以上经验,熟悉PHP.html.asp.java等等这 ...
- SSM 整合 Shiro
1. 导包 <!-- spring --> <dependency> <groupId>org.springframework</groupId> &l ...
- C++之数据类型--整形&sizeof关键字
数据类型: C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 整型 **作用**:整型变量表示的是==整数类型==的数据 C++中能够表示整型的类型有以下几种方式 ...
- Dribbble 流行的配色风格是什么?
Dribbble 是众所周知的设计社群网站,在网站中有许多人分享设计作品,互相交流或从其他设计获取灵感.当然也有不少网站应运而生,例如 Freebbble 可免费下载 Dribbble 数千种设计素材 ...
- HTML语法检测
网络上收集到的资源: HTML在线编辑//////////////////////////////////////////http://tool.oschina.net/codeformat/ 文本框 ...
- python open函数关于w+ r+ 读写操作的理解(转)
r 只能读 (带r的文件必须先存在)r+ 可读可写 不会创建不存在的文件.如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容.w+ 可读可写 如果文件存在 则覆 ...
- 删除除了特指的某几个文件外的所有文件的Linux指令
栗子: 不删除 logs文件夹和credential文件夹 1. rm -rf !(logs|credential) 2. ls | grep -v logs |grep -v credenti ...
- 数据库实例性能调优利器:Performance Insights
Performance Insights是什么 阿里云RDS Performance Insights是RDS CloudDBA产品一项专注于用户数据库实例性能调优.负载监控和关联分析的利器,以简单直 ...
- day25 模块,sys, logging, json, pickle
Python之路,Day13 = Python基础13 sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sy ...
- ON_EVENT 报错
错误提示: error C2440: 'initializing' : cannot convert from 'const wchar_t [1]' to 'UINT' error C2440: ' ...