SPOJ - DWARFLOG Manipulate Dwarfs 线段树+想法题;
题意:给你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 线段树+想法题;的更多相关文章
- ZJOI2017 day2 T2 线段树 想法题
考完D2发现自己简直zz了...花式扔基本分 首先这道题有个显然的套路:树上一些点到一个定点的距离和=这些点深度和+点数*定点深度和-2*lca深度和 ——上一次见这个套路是LNOI2014,上次做的 ...
- hdu-1540线段树刷题
title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- hdu-5023线段树刷题
title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...
- poj-2777线段树刷题
title: poj-2777线段树刷题 date: 2018-10-16 20:01:07 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道线段树的染色问题,,, ...
- zoj-1610线段树刷题
title: zoj-1610线段树刷题 date: 2018-10-16 16:49:47 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道简单的线段树区间染色问 ...
- 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个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...
- hdu 1754 I Hate It 线段树基础题
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...
随机推荐
- Windows下切换盘符
方法: 直接输入盘符+引号,例如输入D:,不区分大小写. 使用cd命令,例如cd /d D: 使用cd命令有一些要注意的地方: 在同一个磁盘分区里,不需要加上\d,但是不同磁盘分区切换的时候,需要加上 ...
- LR 测试http协议xml格式数据接口
Action() { lr_start_transaction("T1"); web_custom_request("xxxxHTTPRequest", &qu ...
- Spring集成Mybatis,spring4.x整合Mybatis3.x
Spring集成Mybatis,spring4.x整合Mybatis3.x ============================== 蕃薯耀 2018年3月14日 http://www.cnblo ...
- 解决ora-01034和ora-27101错误
使用plsql登录oracle数据库,提示如下错误: 定位原因:tnsnames.ora文件中数据库的配置参数有误所致 解决办法:将SERVICE_NAME修改为SID即可
- Ansible 远程执行命令
写法如下: [root@localhost ~]$ ansible 192.168.119.134 -m command -a 'date' # 对指定的主机远程执行命令,-m 指定使用哪个模块,-a ...
- Nginx 域名重定向
假设 www.old.com 为旧的域名,而 www.new.com 为新的域名,要实现当我们访问 new 的时候自动重定向到 old 域名,配置如下: server { //第一种配置方法 serv ...
- adb(android debug bridge)命令
adb(android debug bridge) adb devices --查看当前连接的模拟器/设备 adb remount --模拟器/设备重新启动,保证能用 adb push src des ...
- LinQ的初步学习与总结
嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...
- codeforcess水题100道
之所以在codeforces上找这100道水题的原因是为了巩固我对最近学的编程语言的掌握程度. 找的方式在codeforces上的PROBLEMSET中过的题最多的那些题里面出现的最前面的10个题型, ...
- Java实现给定字符串的倒序输出
1.除2判中法: public static String orderDesc(String str){ byte [] bytes = str.getBytes(); for ( int i = 0 ...