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 ...
随机推荐
- jenkins自定义安装目录
jenkins默认会安装到jvm环境变量的user.dir目录下,这样在系统重新安装后容易丢失. 将以下文件保存为start.bat放到jekins.jar同一目录,执行start.bat即可将jek ...
- django中的时区设置TIME_ZONE,USE_TZ
Django如果开启了Time Zone功能,则所有的存储和内部处理,甚至包括直接print显示全都是UTC的.只有通过模板进行表单输入/渲染输出的时候,才会执行UTC本地时间的转换. 所以我建议后台 ...
- Centos7 上安装 FastDFS
1.安装gcc(编译时需要) FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc yum install -y gcc ...
- Business.Startup.Learning from Startup Mistakes at SpringSource
http://www.infoq.com/news/2014/07/startup-spring
- mac/linux 修改vim显示信息
转自:http://www.cnblogs.com/yjmyzz/p/4019783.html 步骤1: cp /usr/share/vim/vimrc ~/.vimrc 先复制一份vim配置模板到个 ...
- Delphi--最强大的开发工具(欢迎转载)
最强大的开发工具 Delphi 目录 --------------------------------------------------------------------------- 前言 De ...
- UI设计教程分享:Ps合成炫酷机械姬
本次给大家分享一个通过PS合成一个炫酷的机械姬,在这个教程里给大家展示图像的色彩处理.人物光影塑造和创意实现及细节处理,教程比较简单,创意十足,看过<机械姬>电影的同学们一定知道这个有多炫 ...
- jQuery操作(二)
一: 操作元素 1. 属性操作 1.1 $("p").text() $("p").html() $(":checkbox").val() 1 ...
- html中 和空格的区别
Non-Breaking Space 注意是 这6个字符是一个整体, 在html中, 是空格的占位符.一个 代表一个空格:两个 代表两个空格,即使用几个 就显示几个空格. 但是普通的空格在h ...
- Writing modular applications with laravel-modules
01-07-2016 Let me start by saying Laravel is an amazing framework. However when it comes to writing ...