题意:给你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. 【安全开发】Android安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

  2. 全屏加载loading显示的解决方法

    step1:可以在网页里加一个div用来现实loading. <div id="loading"> <!--这里放你的loading时显示的动画或者文字--> ...

  3. solaris 下查看某程序所开端口

    普通linux机器下可以用netstat -anp | grep pid即可. solaris下则不同,可以借助pfiles工具,pfiles $pid | grep sock pfiles | gr ...

  4. Nginx 代理

    如下,配置 Nginx 成为一台代理服务器 [root@localhost ~]$ cat /usr/local/nginx/conf/vhost/proxy.conf server { listen ...

  5. 团购已满,O2O只是个笑话吗?

    团购的用户习惯经过多年的“发酵”以后,大多数用户的团购习惯已经养成,同样一张电影票团购和直接现场购买的差价在一倍以上,当然O2O领域的其他情况也差不多,面对明显的“优惠”,用户当然乐意使用团购服务. ...

  6. Yii 开发过程 tips

    1. 查看DAO 生成的sql 结果(类似TP的 getLastSql): $reto = $edb->createCommand($bsql); echo $reto->text; 2. ...

  7. Qt下libusb-win32的使用方法

    之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件. 发现了libusb这个库可以用作无驱 ...

  8. 推荐系统之隐语义模型(LFM)

    LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣 ...

  9. Python学习(23):Python面向对象(1)速成

    转自 http://www.cnblogs.com/BeginMan/p/3190776.html 一.Python经典类与新类 经典类:如果没有直接或间接的子类化一个对象,也就是说如果没有指定一个父 ...

  10. String例子

    #include <string.h> class String{ public: String(const String& str); String(const char* st ...