【线段树】矮人排队(jzoj(gz) 3236)
矮人排队
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)相关推荐
- 【JZOJ3236】矮人排队
description 在七山七海之外的一个小村庄,白雪公主与N个矮人住在一起,所有时间都花在吃和玩League of Legend游戏.白雪公主决心终结这样的生活,所以为他们举办了体育课. 在每节课 ...
- 题解 DTOJ #1438. 矮人排队(lineup)
欢迎访问 My Luogu Space. [题目大意] 有 \(n\) 个身高为 \([1,\ n]\) 的且各不相同的人排成一个序列. 有两种操作: 让位置 \(x,\ y\) 的人交换位置. 给定 ...
- Codeforces 173E Camping Groups 线段树
Camping Groups 我们先计算出, 每个点当leader所能掌控的最多人数. 然后我们把询问离线, 丢到responsibility最大的那个地方去. 然后从大到小往线段树里加人, 加入完之 ...
- 小清的线段树25题日志01 线段树下你和我 欢乐多又多
前言 难度大致会按排序来 就不写总结啦 嘻嘻 适合刚学线段树的人(和我一样 练手 /*if you can't see the repayWhy not just work step by stepr ...
- jzoj3236-矮人排队【权值线段树】
正题 题目链接:https://jzoj.net/senior/#main/show/3236 题目大意 一个序列两个操作 1XY:1\ X\ Y:1 X Y:交换XXX和YYY两个数 2AB:2\ ...
- 87-区间线段树(板子)--那个苑区的人最瘦
1476.线段树--那个苑区的人最瘦 (10分) C时间限制:500 毫秒 | C内存限制:655350 Kb 题目内容: 每年九月份开学的时候, 学校为了迎接新生, 食堂的伙食自然会比平时稍微好一 ...
- [线段树] Jzoj P1214 项链工厂
Description T 公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱.最近T 公司打算推出一款项链自助生产系统,使用该系统顾客可以自行设计心目中 ...
- [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)
2021-09-07 test [TJOI2013]拯救小矮人 「ICPC World Finals 2019」Hobson 的火车 [TJOI2013]拯救小矮人 luogu4823 考试题目的数据 ...
- 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 ...
最新文章
- ecplise中插件Jrebel的安装
- Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别
- Android AutoWrapTextView 解决中英文排版问题
- 分享Kali Linux 2017年第二周镜像文件
- 4G EPS 的架构模型
- 线性规划总结3——单纯形法和对偶单纯形法
- sqlserver聚合索引(clustered index) / 非聚合索引(nonclustered index)的理解
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
- Android ActionBar以及menu的代码设置样式
- java Hashset去重原理及HashMap key唯一原理
- W3CSchool CHM API 帮助文档(全)
- docker-compose 启动顺序的问题depends_on
- 二、设计模式总览及工厂模式详解
- 3D STL文件解析
- 启善企业微信自动加好友助手教程
- Android之内嵌PDF预览
- Android ListView优化之局部刷新(更新)(非notifyDataSetChanged)
- android Git版本控制
- Bootstarp未读消息铃铛
- 英语语法汇总(2.冠词)
热门文章
- linux中显示目录名,在linux下显示中文目录和文件名
- MySQL8的inodb参数设置_MySQL8.0自适应参数innodb_dedicated_server
- 安卓平板运行python_使用Python进行手机平板移动开发 | 学步园
- Java图形 图像与多媒体基础,十一. 图形、图像与多媒体1.绘图基础
- docker 容器启动顺序_Docker容器启动时初始化Mysql数据库
- 一张网页带你了解中秋节的前世今生
- [MyBatisPlus]乐观锁和悲观锁
- [JavaWeb-XML]XML约束概述
- [Java网络编程]UDP通信程序练习
- C++实现线段树RMQ-单点修改,区间查询