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 ...
随机推荐
- PAT 1046 划拳(15)(代码)
1046 划拳(15)(15 分) 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢 ...
- iOS push新的调用方法
// IOS8 新系统需要使用新的代码if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){ [[UIAppl ...
- 让eclipse调试和豌豆荚并存
豌豆荚有一个设置 设置->高级设置->开发者模式 勾上开发者模式 确定. 你什么手机的驱动都不用安装了. 就可以直接使用豌豆荚,也可以使用eclipse进行调试.
- 大神你好,可以帮我P张图吗?
韩国版的求大神帮我P张图,看得有点下巴脱臼啊!哈哈哈哈哈哈哈~ 感觉照片拍得很尴尬,请大神P得更有动感 拍了跳跃照片,但内衣露出来一点,能帮忙去掉吗 不喜欢没穿制服的样子,请帮忙加上制服 希望背景 ...
- dirname(__FILE__)
- Tomcat+Redis+Nginx实现session共享(Windows版)
redis安装:xx nginx安装:xx 步骤: 1.下载tomcat-redis-session-manager相应的jar包,主要有三个: wget https://github.com/dow ...
- Spring 常见注解
@Component:标准一个普通的spring Bean类. @Controller:标注一个控制器组件类. @Service:标注一个业务逻辑组件类. @Repository:标注一个DAO组件类 ...
- windows + php7.1 + redis3.1.4
首先确定PHP版本(MSVC14 x64 NTS) 下载redis扩展 拷贝php ext目录,修改php.ini配置,添加 extension=php_redis.dll 重启apache,确认re ...
- NOIP水题测试(2017082501)
日常水题测试又来了! 以后答案都以单题形式公布. 下面看今天的水题: 时间限制:5小时 题目一:无法形容的水 题目二:比上一题还水 题目三:一元三次方程求解 题目四:单词接龙 题目五:统计单词个数 题 ...
- Django高级篇一RESTful架构及API设计
一.什么是RESTful架构? 通过互联网通信,建立在分布式体系上"客户端/服务器模式”的互联网软件,具有高并发和高延时的特点. 简单的来说,就是用开发软件的模式开发网站.网站开发,完全可以 ...