矮人排队

jzoj (gz)3236

题目大意:

有n个人,高度分别为1,2……n(高度按输入来看),现在有两种操作
1:把第x个人和第y个人换一下
2:询问高度为A,A+1……B这B-A+1个人是否站在一起

输入样例#1:

5 3
2 4 1 3 5
2 2 5
1 3 1
2 2 5

输出样例#1:

NO
YES

输入样例#2:

7 7
4 7 3 5 1 2 6
2 1 7
1 3 7
2 4 6
2 4 7
2 1 4
1 1 4
2 1 4

输出样例#2:

YES
NO
YES
NO
YES

数据范围

50%的数据:类型2询问中A,B满足B−A≤50B-A≤50B−A≤50
100%的数据:1≤X,Y≤N,X≠Y,1≤A≤B≤N,2≤N≤200,000,2≤M≤200,000。1≤X,Y≤N,X≠Y,1≤A≤B≤N,2≤N≤200,000,2≤M≤200,000。1≤X,Y≤N,X̸​=Y,1≤A≤B≤N,2≤N≤200,000,2≤M≤200,000。

解题思路:

首先一看就知道是线段树
但因为查询的是高度,所以我们线段树的下标是高度而不是位置,而存的就是位置,这样当查询时,求出高度为A到B这些人中的位置最大和最小,然后看一看这两个数相减是不是B-A+1即可

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,u,x,y,maxans,minans,a[200500],w[200500];
struct rec
{int l,r,maxx,minn;
}tree[1600500];
void up(int dep)//上传
{tree[dep].maxx=max(tree[dep*2].maxx,tree[dep*2+1].maxx);tree[dep].minn=min(tree[dep*2].minn,tree[dep*2+1].minn);
}
void make(int dep)//建树
{if (tree[dep].l==tree[dep].r){tree[dep].maxx=a[tree[dep].l];tree[dep].minn=a[tree[dep].l];return;}int mid=(tree[dep].l+tree[dep].r)>>1;tree[dep*2].l=tree[dep].l,tree[dep*2].r=mid;tree[dep*2+1].l=mid+1,tree[dep*2+1].r=tree[dep].r;make(dep*2);make(dep*2+1);up(dep);
}
int find(int dep,int l)
{if (tree[dep].l==l&&tree[dep].r==l) return tree[dep].maxx;int mid=(tree[dep].l+tree[dep].r)>>1;if (l<=mid) return find(dep*2,l);else return find(dep*2+1,l);
}
void change(int dep,int l,int s)
{if (tree[dep].l==l&&tree[dep].r==l){tree[dep].maxx=tree[dep].minn=s;return;}if (tree[dep].l>=tree[dep].r) return;int mid=(tree[dep].l+tree[dep].r)>>1;if (l<=mid) change(dep*2,l,s);else change(dep*2+1,l,s);up(dep);
}
void swapp(int x1,int y1)
{change(1,w[x1],y1);//第x1个人变为y1,因为是坐标是高度,所以要用wchange(1,w[y1],x1);swap(w[x1],w[y1]);//交换
}
void answer(int dep,int l,int r)//查询
{if (tree[dep].l==l&&tree[dep].r==r){maxans=max(maxans,tree[dep].maxx);minans=min(minans,tree[dep].minn);return;}if (tree[dep].l>=tree[dep].r) return;int mid=(tree[dep].l+tree[dep].r)>>1;if (r<=mid){answer(dep*2,l,r);return;}if (l>mid){answer(dep*2+1,l,r);return;}answer(dep*2,l,mid);answer(dep*2+1,mid+1,r);return;
}
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=n;++i){scanf("%d",&w[i]);//第i个人的高度a[w[i]]=i;//高度为w[i]的人的位置}tree[1].l=1;tree[1].r=n;make(1);for (int i=1;i<=m;++i){scanf("%d %d %d",&u,&x,&y);if (u&1) swapp(x,y);//交换else{minans=2147483647;maxans=0;answer(1,x,y);if (maxans-minans+1==y-x+1) printf("YES\n");//判断长度是否一样else printf("NO\n");}}
}

【线段树】矮人排队(jzoj(gz) 3236)相关推荐

  1. 【JZOJ3236】矮人排队

    description 在七山七海之外的一个小村庄,白雪公主与N个矮人住在一起,所有时间都花在吃和玩League of Legend游戏.白雪公主决心终结这样的生活,所以为他们举办了体育课. 在每节课 ...

  2. 题解 DTOJ #1438. 矮人排队(lineup)

    欢迎访问 My Luogu Space. [题目大意] 有 \(n\) 个身高为 \([1,\ n]\) 的且各不相同的人排成一个序列. 有两种操作: 让位置 \(x,\ y\) 的人交换位置. 给定 ...

  3. Codeforces 173E Camping Groups 线段树

    Camping Groups 我们先计算出, 每个点当leader所能掌控的最多人数. 然后我们把询问离线, 丢到responsibility最大的那个地方去. 然后从大到小往线段树里加人, 加入完之 ...

  4. 小清的线段树25题日志01 线段树下你和我 欢乐多又多

    前言 难度大致会按排序来 就不写总结啦 嘻嘻 适合刚学线段树的人(和我一样 练手 /*if you can't see the repayWhy not just work step by stepr ...

  5. jzoj3236-矮人排队【权值线段树】

    正题 题目链接:https://jzoj.net/senior/#main/show/3236 题目大意 一个序列两个操作 1XY:1\ X\ Y:1 X Y:交换XXX和YYY两个数 2AB:2\ ...

  6. 87-区间线段树(板子)--那个苑区的人最瘦

    1476.线段树--那个苑区的人最瘦 (10分) C时间限制:500 毫秒 |  C内存限制:655350 Kb 题目内容: 每年九月份开学的时候, 学校为了迎接新生, 食堂的伙食自然会比平时稍微好一 ...

  7. [线段树] Jzoj P1214 项链工厂

    Description T 公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱.最近T 公司打算推出一款项链自助生产系统,使用该系统顾客可以自行设计心目中 ...

  8. [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)

    2021-09-07 test [TJOI2013]拯救小矮人 「ICPC World Finals 2019」Hobson 的火车 [TJOI2013]拯救小矮人 luogu4823 考试题目的数据 ...

  9. JZOJ 7036. 2021.03.30【2021省赛模拟】凌乱平衡树(平衡树单旋+权值线段树)

    JZOJ 7036. 2021.03.30[2021省赛模拟]凌乱平衡树 题目大意 给出两棵Treap,大小分别为 n , m n,m n,m,每个点的 p r i o r i t y priorit ...

最新文章

  1. ecplise中插件Jrebel的安装
  2. Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别
  3. Android AutoWrapTextView 解决中英文排版问题
  4. 分享Kali Linux 2017年第二周镜像文件
  5. 4G EPS 的架构模型
  6. 线性规划总结3——单纯形法和对偶单纯形法
  7. sqlserver聚合索引(clustered index) / 非聚合索引(nonclustered index)的理解
  8. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
  9. Android ActionBar以及menu的代码设置样式
  10. java Hashset去重原理及HashMap key唯一原理
  11. W3CSchool CHM API 帮助文档(全)
  12. docker-compose 启动顺序的问题depends_on
  13. 二、设计模式总览及工厂模式详解
  14. 3D STL文件解析
  15. 启善企业微信自动加好友助手教程
  16. Android之内嵌PDF预览
  17. Android ListView优化之局部刷新(更新)(非notifyDataSetChanged)
  18. android Git版本控制
  19. Bootstarp未读消息铃铛
  20. 英语语法汇总(2.冠词)

热门文章

  1. linux中显示目录名,在linux下显示中文目录和文件名
  2. MySQL8的inodb参数设置_MySQL8.0自适应参数innodb_dedicated_server
  3. 安卓平板运行python_使用Python进行手机平板移动开发 | 学步园
  4. Java图形 图像与多媒体基础,十一. 图形、图像与多媒体1.绘图基础
  5. docker 容器启动顺序_Docker容器启动时初始化Mysql数据库
  6. 一张网页带你了解中秋节的前世今生
  7. [MyBatisPlus]乐观锁和悲观锁
  8. [JavaWeb-XML]XML约束概述
  9. [Java网络编程]UDP通信程序练习
  10. C++实现线段树RMQ-单点修改,区间查询