由运算符有优先级可以想到先算优先级小的,然后两边递归,但符号比较少,有大量相同的,同级之间怎么办呢?因为运算符满足结合律,同级之间选一个然后两边递归也是没问题的,然后我们想到用fhqtreap进行维护,但堆那一维不是随机的,所以我们merge时再按两棵树的大小比例搞一个随机,把小的往大的上合(玄学,如果直接把小的和到大的上得30分),另外说一下是满足交换律才能用这种方法的,要不满足交换律转一下值就全换了,还要遍历整棵树来维护。

注意merge(l,r)应保证r里的元素的二叉排序树那一维的劝值大于l。

第一次写这种数据结构,直接抄的题解

PS:代码来源:http://blog.csdn.net/werkeytom_ftd/article/details/50635596;

#include "expr.h"
#include<ctime>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=+;
int root[maxn],siz[maxn],tr[maxn][],fix[maxn];
bool bz[maxn];
Data key[maxn],num[maxn],wdc;
int i,j,k,l,mid,r,n,m,tot,top;
int newno(int x){
siz[++tot]=siz[x];tr[tot][]=tr[x][];tr[tot][]=tr[x][];
fix[tot]=fix[x];bz[tot]=bz[x];key[tot]=key[x];num[tot]=num[x];
return tot;
}
void update(int x){
siz[x]=siz[tr[x][]]+siz[tr[x][]]+;
if(fix[x]<=&&tr[x][]&&tr[x][])
num[x]=F(num[tr[x][]],num[tr[x][]],fix[x]);
else num[x]=key[x];
}
void mark(int &x){
if(!x)return;
int y=newno(x);
bz[y]^=;swap(tr[y][],tr[y][]);
x=y;
}
void pushdown(int x){
if(bz[x]){mark(tr[x][]);mark(tr[x][]);bz[x]=;}
}
bool cmp(int x,int y){
if(fix[x]==fix[y])return ((siz[y])<siz[x]);
else return fix[x]<fix[y];
}
void merge(int l,int r,int &x){
if(!l||!r){x=l+r;return;}
pushdown(l);pushdown(r);
int t;
if(cmp(l,r)){
t=newno(l);
merge(tr[l][],r,tr[t][]);
}
else{
t=newno(r);
merge(l,tr[r][],tr[t][]);
}
update(t);
x=t;
}
void split(int x,int y,int &l,int &r){
if(!x){l=r=;return;}
if(!y){l=;r=x;return;}
pushdown(x);
int t;
if(siz[tr[x][]]>=y){
split(tr[x][],y,l,r);
t=newno(x);tr[t][]=r;
update(t);r=t;
}
else{
split(tr[x][],y-siz[tr[x][]]-,l,r);
t=newno(x);tr[t][]=l;
update(t);l=t;
}
}
void init(int test_id,int n,int m,int k,const Data *a,const int *ops){
srand(time());
wdc=a[];top=;int t;
for(int i=n;i>=;--i){
t=newno();siz[t]=;fix[t]=;
key[t]=num[t]=a[i-];
merge(t,root[],root[]);
if(i>){
int t=newno();
siz[t]=;fix[t]=ops[i-];key[t]=num[t]=wdc;
merge(t,root[],root[]);
}
}
}
Data modify_data(int id,int pos,Data x){
++top;++pos;
split(root[id],*pos-,l,r);
split(l,*pos-,l,mid);
int t=newno(mid);
key[t]=num[t]=x;
merge(l,t,l);merge(l,r,root[top]);
return num[root[top]];
}
Data modify_op(int id,int pos,int new_op){
++top;
split(root[id],*pos,l,r);
split(l,*pos-,l,mid);
int t=newno(mid);
fix[t]=new_op;
merge(l,t,l);merge(l,r,root[top]);
return num[root[top]];
}
Data reverse(int id,int l,int r){
++top;
++l,++r;j=l;k=r;
split(root[id],*k-,l,r);
split(l,*j-,l,mid);
mark(mid);
merge(l,mid,l);
merge(l,r,root[top]);
return num[root[top]];
}

wc2016鏖战表达式(可持久treap)的更多相关文章

  1. [uoj173]鏖战表达式

    2018年论文题,上接loj2506,主要是论文中的第4章,也可快速跳至原题解 5.平衡树的嵌套问题 平衡树嵌套 所谓平衡树嵌套,就是若干棵平衡树,其中若干棵平衡树的根会指向另一颗平衡树上的一个节点 ...

  2. 2017-12 CDQZ集训(已完结)

    从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...

  3. WC2016自测

    挑战NPC 原题链接 爆搜20分,贪心10分,网络流30分 //挑战NPC #include <cstdio> #include <cstring> #include < ...

  4. MyBatis持久层框架使用总结

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  5. NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  6. WC2016游记

    出发的时候,长沙忽然就出了太阳,明媚而和煦. [day0 25] 噫吁嚱,危乎高哉!蜀道之难,难于上青天! 总之本来上午已经准备好9:50的飞机…然后就在一次次的手机查询中变成了5点多…然后也不是直飞 ...

  7. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  8. c++ 数据持久层研究(一)

    C++ORM框架自动生成代码数据库  用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...

  9. 开源顶级持久层框架——mybatis(ibatis)——day01

    mybatis-day01     1.对原生态jdbc程序中的问题总结         1.1环境             java环境:jdk             eclipse:indigo ...

随机推荐

  1. Struts2框架的数据封装一之属性封装(属性封装的第一种方式:对参数进行封装)

    request带着参数来,aciton对其进行处理.在学习action之前,使用的是servlet对request进行处理.request请求时会带有参数,所以我们要对这些参数进行封装. 1. 为什么 ...

  2. 安装git工具在ubuntu系统

    Git is one of the most popular tools used for distributed version control system(VCS). Git is common ...

  3. vs调试的时候出错:无法启动程序,操作在当前状态中是非法的

    工具--选项--调试--常规--启用asp.net的JavaScript调试(chrome和ie)去掉勾选

  4. vue2.0一安装的插件详解

    babel-runtime 对ES语法转义 fastclick  移动端300ms兼容 babel-polyfill 兼容Ie浏览器 //babel-polyfill引用 推荐采用webpack入口文 ...

  5. python 虚拟环境操作 virtualenv +virtualenvwrapper

    Window 下创建python的虚拟环境 下载工具 pip install virtualenv 创建虚拟环境目录 # 注意此命令创建的虚拟环境目录是在当前目录下 virtualenv testen ...

  6. Error starting daemon: error initializing graphdriver: driver not supported

    Error starting daemon: error initializing graphdriver: driver not supported systemctl stop docker rm ...

  7. XHR的对象及用法

    function  createXHR(){         //检测原生XHR对象是否存在,如果存在刚返回它的新实例:     //如果不存在,则检测ActiveX对象;     //如果两个都不存 ...

  8. Java中的队列都有哪些,有什么区别?

    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口. 1.未 ...

  9. maven 单元测试 ( http://www.cnblogs.com/qinpengming/p/5225380.html )

     对junit单元测试的报告:类似这样的结果 ------------------------------------------------------- T E S T S ----------- ...

  10. dirname(__FILE__)