如何用treap写luogu P3391
treap大法好!!!
splay什么的都是异端
——XZZ
先%FHQ为敬
(fhq)treap也是可以搞区间翻转的
每次把它成(1L-1)(LR)(R+1~n)三块然后打标记拼回去
对于有标记的先交换一下左右儿子再异或一下各儿子的标记
虽说跑的不算快但还是可以挑战一下splay的
代码蒯上
//get out splay!
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{
register int _a=0;bool _b=1;register char _c=getchar();
while((_c<'0' || _c>'9') && _c!='-')_c=getchar();
if(_c=='-')_b=0,_c=getchar();
while(_c>='0' && _c<='9')_a=_a*10+_c-48,_c=getchar();
return _b?_a:-_a;
}
const int _ = 100007;int seed=19260817;
inline int ou(){return seed=seed*17283%2147483647;}//看RP的时候到了
int ch[_][2],d[_],rn[_],sz[_],all=0,n,root=0;
int rev[_];
inline void up(int x){sz[x]=1+sz[ch[x][0]]+sz[ch[x][1]];}//更新节点值
inline void down(int x)//向下传递翻转标记
{
if(x && rev[x])
{
rev[x]=0,swap(ch[x][0],ch[x][1]);
if(ch[x][0])rev[ch[x][0]]^=1;
if(ch[x][1])rev[ch[x][1]]^=1;
}
}
inline int malloc(int v){sz[++all]=1;d[all]=v;rn[all]=ou();return all;}//新建一个节点
inline int merge(int a,int b)
{
if(!a || !b) return a+b;down(a),down(b);
if(rn[a]<rn[b]){ch[a][1]=merge(ch[a][1],b);up(a);return a;}
else{ch[b][0]=merge(a,ch[b][0]);up(b);return b;}
}
void split(int now,int k,int &a,int &b)
{
if(!now){a=b=0;return;}
down(now);
if(k<=sz[ch[now][0]])b=now,split(ch[now][0],k,a,ch[now][0]);
else a=now,split(ch[now][1],k-sz[ch[now][0]]-1,ch[now][1],b);
up(now);
}
int plant(int l,int r)//种树
{
if(l>r)return 0;
int mid=(l+r)>>1,now=malloc(mid-1);
ch[now][0]=plant(l,mid-1);ch[now][1]=plant(mid+1,r);
up(now);return now;
}
void print(int now)//按中序遍历输出答案
{
if(!now)return;down(now);
print(ch[now][0]);
if(d[now]>=1 && d[now]<=n)printf("%d ",d[now]);
print(ch[now][1]);
return;
}
void reverse(int l,int r)//旋转
{
int a,b,c;
split(root,l-1,a,b),split(b,r-l+1,b,c);
rev[b]^=1;
root=merge(a,merge(b,c));
}
int main()
{
register int m,l,r;
n=gotcha();m=gotcha();
root=plant(2,n+3);
while(m--)
{
l=gotcha(),r=gotcha();
reverse(l,r);
}
print(root);
return 0;
}
treap坠强!
如何用treap写luogu P3391的更多相关文章
- [luogu P3391] 文艺平衡树
[luogu P3391] 文艺平衡树 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区 ...
- 如何用ActiveQt写导出类
如何用ActiveQt写导出类 最近一直在用ActiveQt框架来写ActiveX插件, 由于项目需要提示类的导出, 所以上午捣鼓了一下, 现在记录记录.其实内容主要是把Qt手册里自己用到的部分整理一 ...
- linux常用终端指令+如何用vim写一个c程序并运行
在装好ubuntu之后今天学习了一些linux的一些基础知识: windows里面打开命令窗口是win+r,在linux系统里面,ctrl+alt+t打开终端,今天的一些指令都是围绕终端来说的 首先s ...
- 2019-2-13-Latex-论文elsevier,手把手如何用Latex写论文
title author date CreateTime categories Latex 论文elsevier,手把手如何用Latex写论文 lindexi 2019-02-13 10:38:20 ...
- Luogu P3391 文艺平衡树(Splay or FHQ Treap)
这道题要求区间反转...好东西.. 对于Splay:把l-1旋到根,把r+1旋到根的右儿子,这样r+1的左儿子就是整个区间了,然后对这个区间打个tg 注意要插-Inf和Inf到树里面,防止越界,坐标要 ...
- luogu P3391 【模板】文艺平衡树(Splay) 非旋转treap
Code: #include<bits/stdc++.h> using namespace std; void setIO(string s) { string in=s+".i ...
- Luogu P3391 【模板】文艺平衡树 Splay 平衡树
https://www.luogu.org/problemnew/show/P3391 以前写过题解的入门题重写练板子.wdnmd真就 ' == ' 写成 ' = ' 了编译器不报错呗. #inclu ...
- Luogu P3391 【模板】文艺平衡树(FHQ-Treap)
题意 给出一个长为$n$序列$[1,2,...,n]$,$m$次操作,每次指定一段区间$[l,r]$,将这段区间翻转,求最终序列 题解 虽然标题是$Splay$,但是我要用$FHQ\ Treap$,考 ...
- 如何用java写出无副作用的代码
搞java的同学们可能对无副作用这个概念比较陌生,这是函数式编程中的一个概念,无副作用的意思就是: 一个函数(java里是方法)的多次调用中,只要输入参数的值相同,输出结果的值也必然相同,并且在这个函 ...
随机推荐
- HTML5标签选择指引
- vuejs 组件 移动端push 没有渲染页面
this.idcards.push(arr) 这个无效 就知道了 vuejs有个跟push相同的方法 console.log(this.list.push.toString()) 这个push是个同名 ...
- JFinal-美女图爬虫-一个不正经的爬虫代码
去年我做了一个项目,大量使用爬虫抓取数据,使用JFinal+JSoup组合,抓取数据,数据清洗筛选,最终保存到数据库里,结构化. 今天,我发布一个不正经的爬虫项目,如果你对JSoup做爬虫感兴趣,可以 ...
- selenium3+webdriver学习笔记1(访问常用请求)
#!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriverimport osimport time url1= ...
- ThreadLocal的内存泄露
ThreadLocal的目的就是为每一个使用ThreadLocal的线程都提供一个值,让该值和使用它的线程绑定,当然每一个线程都可以独立地改变它绑定的值.如果需要隔离多个线程之间的共享冲突,可以使用T ...
- 洛谷 P2663 越越的组队
题目描述 班级要组织一场综合能力竞赛,全班同学(N个,N是偶数)分成两队互相竞争.老师找到了越越并给了越越一张全班同学综合能力测试的成绩,要求他从全班同学中选出一半(他自己也可能被选),并要求这些同学 ...
- SAP C4C Opportunity和SAP ERP Sales流程的集成
首先在C4C里创建一个新的Opportunity: 给这个Opportunity添加一个新的产品: 点按钮:Request Pricing, 从ERP抓取pricing数据,点按钮之前Negotiat ...
- 使用ABAP批量下载有道云笔记中的图片
Jerry喜欢用有道云笔记这款软件做自己的知识管理和知识体系的构建. 当您看到一篇好的有道云笔记分享时,可能会想将其精美的图片下载到本地.作为程序猿,我们不会去手动一张张下载.写个程序帮我们自动下载吧 ...
- CF Gym 100187J Deck Shuffling (dfs判连通)
题意:给你一堆牌,和一些洗牌机,可以改变牌的顺序,问你能不能通过洗牌机把数字为x的牌洗到第一个位置. 题解:反向建边,dfs判断连通性 #include<cstdio> #include& ...
- Android(java)学习笔记130:Android中操作XML数据(使用Pull解析器)
1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...