wc2016鏖战表达式(可持久treap)
由运算符有优先级可以想到先算优先级小的,然后两边递归,但符号比较少,有大量相同的,同级之间怎么办呢?因为运算符满足结合律,同级之间选一个然后两边递归也是没问题的,然后我们想到用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)的更多相关文章
- [uoj173]鏖战表达式
2018年论文题,上接loj2506,主要是论文中的第4章,也可快速跳至原题解 5.平衡树的嵌套问题 平衡树嵌套 所谓平衡树嵌套,就是若干棵平衡树,其中若干棵平衡树的根会指向另一颗平衡树上的一个节点 ...
- 2017-12 CDQZ集训(已完结)
从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...
- WC2016自测
挑战NPC 原题链接 爆搜20分,贪心10分,网络流30分 //挑战NPC #include <cstdio> #include <cstring> #include < ...
- MyBatis持久层框架使用总结
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...
- NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- WC2016游记
出发的时候,长沙忽然就出了太阳,明媚而和煦. [day0 25] 噫吁嚱,危乎高哉!蜀道之难,难于上青天! 总之本来上午已经准备好9:50的飞机…然后就在一次次的手机查询中变成了5点多…然后也不是直飞 ...
- 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)
转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...
- c++ 数据持久层研究(一)
C++ORM框架自动生成代码数据库 用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...
- 开源顶级持久层框架——mybatis(ibatis)——day01
mybatis-day01 1.对原生态jdbc程序中的问题总结 1.1环境 java环境:jdk eclipse:indigo ...
随机推荐
- Struts2框架的数据封装一之属性封装(属性封装的第一种方式:对参数进行封装)
request带着参数来,aciton对其进行处理.在学习action之前,使用的是servlet对request进行处理.request请求时会带有参数,所以我们要对这些参数进行封装. 1. 为什么 ...
- 安装git工具在ubuntu系统
Git is one of the most popular tools used for distributed version control system(VCS). Git is common ...
- vs调试的时候出错:无法启动程序,操作在当前状态中是非法的
工具--选项--调试--常规--启用asp.net的JavaScript调试(chrome和ie)去掉勾选
- vue2.0一安装的插件详解
babel-runtime 对ES语法转义 fastclick 移动端300ms兼容 babel-polyfill 兼容Ie浏览器 //babel-polyfill引用 推荐采用webpack入口文 ...
- python 虚拟环境操作 virtualenv +virtualenvwrapper
Window 下创建python的虚拟环境 下载工具 pip install virtualenv 创建虚拟环境目录 # 注意此命令创建的虚拟环境目录是在当前目录下 virtualenv testen ...
- Error starting daemon: error initializing graphdriver: driver not supported
Error starting daemon: error initializing graphdriver: driver not supported systemctl stop docker rm ...
- XHR的对象及用法
function createXHR(){ //检测原生XHR对象是否存在,如果存在刚返回它的新实例: //如果不存在,则检测ActiveX对象; //如果两个都不存 ...
- Java中的队列都有哪些,有什么区别?
Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口. 1.未 ...
- maven 单元测试 ( http://www.cnblogs.com/qinpengming/p/5225380.html )
对junit单元测试的报告:类似这样的结果 ------------------------------------------------------- T E S T S ----------- ...
- dirname(__FILE__)