题意:给你2e5个矮人,编号1~N。有2e5个操作:操作1 读取x,y,交换编号为x,y的矮人。操作2 读取AB 判断编号为A,A+1····B的矮人是否连续(不必有序)。

题解:首先用pos[i]保存矮人i的位置,交换就用swap(pos[l],pos[r])来模拟。然后发现条件等价于(pos[l],pos[r])的区间满足最大值为r,最小值为l且区间内人数等于r-l+1即可。所以直接维护区间最大最小值。用change(1,p,x)来更新p处的矮人编号,并pushup。

坑:最开始ask忘写return。想用一个pair<int,int> query 一次性返回大于小于号,会tle。最坑的是忘记判端pos[l]pos[r]的大小,导致RE。

ac代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxnn = ;
int m, n, pos[];
pair<int, int> ans;
struct node {
int l, r, maxn, minn;
}tree[];
inline void push_up(int x) {
tree[x].maxn = max(tree[x << ].maxn, tree[x << | ].maxn);
tree[x].minn = min(tree[x << ].minn, tree[x << | ].minn);
}; inline void build(int x, int l, int r) {
tree[x].l = l; tree[x].r = r;
//tree[x].maxn = l; tree[x].minn = maxnn;
if (l == r) { tree[x].maxn = tree[x].minn = l; return; } int mid = (l+ r) >> ;
build(x << , l, mid);
build(x << | , mid + , r);
push_up(x); };
inline void change(int x, int p,int d) {
int L=tree[x].l,R=tree[x].r;
if (L == R) {
tree[x].maxn = tree[x].minn = d; return;
} int mid = (L + R) >> ;
if (p <= mid)change(x << ,p, d);
else change(x << | ,p, d);
push_up(x); } inline int askmx(int x,int l,int r) {
int L = tree[x].l, R = tree[x].r;
if (L==l&&r == R) return tree[x].maxn; int mid = (L + R) >> ;
if (r <= mid)return askmx(x << , l, r);
else if (l > mid)return askmx(x << | , l, r);
else return max(askmx(x << , l, mid), askmx(x << | , mid + , r));
}
inline int askmn(int x, int l, int r) {
int L = tree[x].l, R = tree[x].r;
if (L == l&&r == R) return tree[x].minn; int mid = L + R >> ;
if (r <= mid)return askmn(x << , l, r);
else if (l > mid)return askmn(x << | , l, r);
else return min(askmn(x << , l, mid), askmn(x << | , mid + , r)); }
int main() {
int n, q;
cin >> n >> q;
build(, , n);
for (int i = ; i <= n; i++)pos[i] = i; for (int i = ; i <= q; i++) {
int x; int l; int r;
scanf("%d", &x);
scanf("%d%d", &l, &r); if (x == ) {
swap(pos[l], pos[r]);
change(, pos[l], l);
change(, pos[r], r);
}
else { //ans= query(1, pos[l], pos[r]);
if (l > r)swap(l, r);
int rr = pos[r];
int ll = pos[l];
if (ll > rr)swap(ll, rr);
if (askmn(, ll, rr)==l&& askmx(, ll, rr)==r&&rr-ll == r-l)puts("YES");
else puts("NO"); }
}
}

SPOJ - DWARFLOG Manipulate Dwarfs 线段树+想法题;的更多相关文章

  1. ZJOI2017 day2 T2 线段树 想法题

    考完D2发现自己简直zz了...花式扔基本分 首先这道题有个显然的套路:树上一些点到一个定点的距离和=这些点深度和+点数*定点深度和-2*lca深度和 ——上一次见这个套路是LNOI2014,上次做的 ...

  2. hdu-1540线段树刷题

    title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...

  3. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  4. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  5. hdu-5023线段树刷题

    title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...

  6. poj-2777线段树刷题

    title: poj-2777线段树刷题 date: 2018-10-16 20:01:07 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道线段树的染色问题,,, ...

  7. zoj-1610线段树刷题

    title: zoj-1610线段树刷题 date: 2018-10-16 16:49:47 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道简单的线段树区间染色问 ...

  8. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) E - Nikita and stack 线段树好题

    http://codeforces.com/contest/760/problem/E 题目大意:现在对栈有m个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...

  9. hdu 1754 I Hate It 线段树基础题

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

随机推荐

  1. VMWare------安装时出现无法将值写入注册表项

    安装时提示详情: 无法打开注册表项UNKNOWN\Components\...请确认你是否有足够的权限访问该注册表项,或者与技术支持人员联系. 解决方法: 关掉360安全卫士等软件再安装

  2. linux 网卡配置信息

    vi /etc/sysconfig/network-scripts/ifcfg-eth0

  3. Spring事务超时、回滚的相关说明

    事务超时: @Transactional(timeout = 60) 如果用这个注解描述一个方法的话,线程已经跑到方法里面,如果已经过去60秒了还没跑完这个方法并且线程在这个方法中的后面还有涉及到对数 ...

  4. Explaining Delegates in C# - Part 5 (Asynchronous Callback - Way 2)

    In this part of making asynchronous programming with delegates, we will talk about a different way, ...

  5. Unity 蓝牙插件

    1.新建一个Unity5.6.2f1工程,导入正版Bluetooth LE for iOS tvOS and Android.unitypackage2.用JD-GUI反编译工具查看unityandr ...

  6. Python标准异常和异常处理详解

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 1.异常处理: 本站Python教程会具体介绍. 2.断言(Asserti ...

  7. 嵌入式系统C编程之堆栈回溯(二)

    前言 本文作为<嵌入式系统C编程之堆栈回溯>的补充版.文中涉及的代码运行环境如下: 一  异常信号 信号就是软件中断,用于向正在运行的程序(进程)发送有关异步事件发生的信息.Linux应用 ...

  8. Objective-c官方文档 怎么使用对象

    版权声明:原创作品,谢绝转载!否则将追究法律责任.   对象发送和接受消息 尽管有不同的方法来发送消息在对象之间,到目前位置是想中括号那样[obj doSomeThing]:左边是接受消息的接收器,右 ...

  9. Android开发训练之第五章第五节——Resolving Cloud Save Conflicts

    Resolving Cloud Save Conflicts IN THIS DOCUMENT Get Notified of Conflicts Handle the Simple Cases De ...

  10. 【VI】如何再执行上一个(历史)命令(已解决)

    输入命令提示符( : )+ 上下箭头(<Up/Down>键) 输入 :his 或者 :history 查看历史