题目不说了,就是区间翻转

传送门:BZOJ 3223 和 CodeVS 3243

第一道题中是1~n的区间翻转,而第二道题对于每个1~n还有一个附加值

实际上两道题的思路是一样的,第二题把值对应到位置就行了

这里我们用伸展树来解决,但其中用到了线段树中的标记思想

对于一个长度的为n的序列,我们把它的每一位向后移动一位,即1~n → 2~n+1,然后再在序列前后分别补上一位:1和n+2。所以我们需要建立一颗节点数为n+2的伸展树,而原序列中的1~n位分别对应新序列中的2~n+1位。

对于每次询问的l和r,实际上就是l+1和r+1,首先找到l+1前一位对应的元素和r+1后一位对应的元素,即l和r+2分别对应的元素的序号。然后将l对应元素通过splay操作旋转到根节点,将r+2对应元素旋转到根节点的右儿子,由排序二叉树的性质可知,r+2的左儿子就是序列l+1~r+1,也就是询问中需要翻转的区间。对r+2的左儿子直接打上标记,在之后找元素序号的时候要记得把标记下传,同时用swap操作来达到翻转的目的。

splay操作和rotate操作在此不赘述。

最后输出的时候,同样查找2~n+1对应的元素序号,将得到的值减1还原,对于CodeVS 3243就再套一个值输出即可。

这里给出BZOJ 3223的代码。

 #include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <ctime>
#include <queue>
#include <string>
#include <map>
typedef long long ll;
using namespace std;
const int MAXN = ;
int n, m;
int root;
int son[MAXN][], fa[MAXN], lazy[MAXN], siz[MAXN]; inline int gi() {
char c;
int sum = , f = ;
c = getchar();
while (c < '' || c > '') {
if (c == '-')
f = -;
c = getchar();
}
while (c >= '' && c <= '') {
sum = sum * + c - '';
c = getchar();
}
return sum * f;
} void build(int l, int r, int f) {
if (l > r)
return;
if (l == r) {
siz[l] = ;
fa[l] = f;
son[f][l > f] = l;
return;
}
int mid = (l + r) >> ;
build(l, mid - , mid);
build(mid + , r, mid);
siz[mid] = siz[son[mid][]] + siz[son[mid][]] + ;
fa[mid] = f;
son[f][mid > f] = mid;
} void pushdown(int o) {
swap(son[o][], son[o][]);
lazy[son[o][]] ^= ;
lazy[son[o][]] ^= ;
lazy[o] = ;
} int find(int o, int p) {
if (lazy[o])
pushdown(o);
int l = son[o][];
int r = son[o][];
if (siz[l] + == p)
return o;
if (siz[l] >= p)
return find(l, p);
else
return find(r, p - siz[l] - );
} void rotate(int x, int &to) {
int l, r;
int f = fa[x];
int ff = fa[f];
l = son[f][] == x ? : ;
r = l ^ ;
if (f == to)
to = x;
else
son[ff][son[ff][] == f] = x;
fa[x] = fa[f];
fa[f] = x;
fa[son[x][r]] = f;
son[f][l] = son[x][r];
son[x][r] = f;
siz[f] = siz[son[f][]] + siz[son[f][]] + ;
siz[x] = siz[son[x][]] + siz[son[x][]] + ;
} void splay(int x, int &to) {
while (x != to) {
int f = fa[x];
int ff = fa[f];
if (f != to) {
if ((son[f][] == x) ^ (son[ff][] == f))
rotate(x, to);
else
rotate(f, to);
}
rotate(x, to);
}
} void reserve(int l, int r) {
int x = find(root, l);
int y = find(root, r + );
splay(x, root);
splay(y, son[x][]);
lazy[son[y][]] ^= ;
} int main() {
n = gi();
m = gi();
build(, n + , );
root = (n + ) >> ;
for (int i = ; i <= m; i++) {
int l = gi();
int r = gi();
reserve(l, r);
}
for (int i = ; i <= n + ; i++)
printf("%d ", find(root, i) - );
return ;
}

[BZOJ 3223 & Tyvj 1729]文艺平衡树 & [CodeVS 3243]区间翻转的更多相关文章

  1. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

  2. BZOJ 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3628  Solved: 2052[Submit][Sta ...

  3. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  4. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  5. bzoj 3223/tyvj 1729 文艺平衡树 splay tree

    原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...

  6. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...

  7. BZOJ 3223 Tyvj 1729 文艺平衡树(Splay)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3223 [题目大意] 给出一数列,问m次区间翻转后的结果. [题解] Splay 区间翻 ...

  8. BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)

    题目链接 splay: #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f ...

  9. BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系

    题解: 每次reverse(l,r) 把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了 每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下 记得建树的时候建 ...

随机推荐

  1. jquery validate表单验证插件

    1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家.     1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素  3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...

  2. 多项目开发下的dll文件管理

    阅读目录: DS01:为什么要对生成的dll文件进行管理? DS02:首先介绍以下两个DOS命令 DS03:第一种实现方法(xcopy) DS04:第二种实现方法(attrib) DS05:分享一个有 ...

  3. css3圆角(还有百分比设置椭圆) 阴影 字体

    一. 现在前面只写知识点,全部内容放在后面截图展示: 给元素添加圆角: border-radius属性,他的值如果等于高的一半,将会等到一个圆形,大于一半叶然是一个圆形 radius是指半径,他求出圆 ...

  4. BlackBerry 9900刷机

    1.安装BlackBerry Desktop Software: 2.安装ROM,双击9900Asia_PBr7.1.0_rel2807_PL5.1.0.692_A7.1.0.1033_China_M ...

  5. PHP干货技巧文,一些PHP性能的优化

    PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置. # vi /etc/php.ini (1) ...

  6. 总结四条对学习Linux系统有帮助的方法

    网络是一个很神奇的东西,现代人的生活离不开网络,网络已深入人们的工作,生活,娱乐等方方面面.网络之所以无处不在,是因为它提供了诸多的网络服务,所以网络服务是网络的灵魂. 互联网上的各种网络服务是架构在 ...

  7. xcode意外退出

    完全不明所以的频繁退出 第一种 排除SVN冲突 在团队开发中,SVN冲突是最常见的了,程序异常时查看SVN文件冲突基本上成了本能. 排除SVN冲突 首先,右键主项目文件即xcodeproj文件,显示包 ...

  8. 用PowerMock mock static方法

    在编写代码时,经常需要调用别人已经写好的工具类,而这些工具提供的方法经常是static方法,在这里,直接贴出<PowerMock实战手册>中的例子 待测试方法: public class ...

  9. C++用法的学习心得(要求包含示例,并反映出利用网络获取帮助的过程)

          大一一年C++的学习生涯,让我感慨颇多!回想起,当初上课时的情形,一切是那么的清晰,仿佛就像是发生在昨天一样.        任何一门学科的学习都是有技巧的.对于c++,我学的并不好,刚开 ...

  10. 【转】修改LINUX时间

    命令格式为: date -s 时间字符串 例如只修改系统的日期,不修改时间(时分秒) date -s 2012-08-02 或只修改时间不修改日期 date -s 10:08:00 当然也可以同时修改 ...