咕了这么久终于把这题补回来了...

关键在于怎么维护“数”的大小,直接用平衡树即可,每个平衡树节点维护的是一个实数区间$[l,r]$,那么$mid$就是这个节点所代表的“数”的大小,也即权值

如果我们使用的平衡树在插入后需要调整树的形态,那么被调整的部分的权值都需要被重新计算,如果平衡树深度太大,那么精度会爆,所以要用重量平衡树(修改影响到的子树大小和平衡树深度都不会太大)

这里用替罪羊树,原生支持重新计算权值,过几天补个旋转treap咕咕咕

btw...替罪羊树是不用记父亲的...是我智障了

#include<stdio.h>
typedef double du;
const du al=.75;
int max(int a,int b){return a>b?a:b;}
du rk[500010];
struct num{int l,r;num(int a=0,int b=0){l=a;r=b;}
}v[500010];
bool operator>(num a,num b){return rk[a.l]==rk[b.l]?rk[a.r]>rk[b.r]:rk[a.l]>rk[b.l];}
bool operator==(num a,num b){return rk[a.l]==rk[b.l]&&rk[a.r]==rk[b.r];}
int l[500010],r[500010],siz[500010],M,sc,rt,fs;
du sl,sr;
int insert(int&x,du lv,du rv,num d){du mv=(lv+rv)*.5;int t;if(x==0){x=++M;siz[x]=1;v[x]=d;rk[x]=mv;return x;}if(v[x]==d)return x;t=v[x]>d?insert(l[x],lv,mv,d):insert(r[x],mv,rv,d);siz[x]=siz[l[x]]+siz[r[x]]+1;if(sc&&(l[x]==sc||r[x]==sc))fs=x;if(siz[x]*al<max(siz[l[x]],siz[r[x]])){sc=x;sl=lv;sr=rv;}return t;
}
int tmp[500010],C;
void dfs(int x){if(l[x])dfs(l[x]);tmp[++C]=x;if(r[x])dfs(r[x]);
}
int build(int L,int R,du lv,du rv){int mid=(L+R)>>1,x=tmp[mid];du mv=(lv+rv)*.5;rk[x]=mv;l[x]=L<mid?build(L,mid-1,lv,mv):0;r[x]=mid<R?build(mid+1,R,mv,rv):0;siz[x]=siz[l[x]]+siz[r[x]]+1;return x;
}
int insert(num d){sc=fs=0;int p=insert(rt,0,1,d);if(sc){C=0;dfs(sc);(sc!=rt?(l[fs]==sc?l:r)[fs]:rt)=build(1,C,sl,sr);}return p;
}
int mx[400010],pos[100010];
void modify(int p,int l,int r,int x){if(l==r){mx[x]=l;return;}int mid=(l+r)>>1;if(p<=mid)modify(p,l,mid,x<<1);elsemodify(p,mid+1,r,x<<1|1);l=mx[x<<1];r=mx[x<<1|1];mx[x]=rk[pos[l]]>=rk[pos[r]]?l:r;
}
int query(int L,int R,int l,int r,int x){if(L<=l&&r<=R)return mx[x];int mid=(l+r)>>1,res=0,t;if(L<=mid){t=query(L,R,l,mid,x<<1);if(rk[pos[t]]>rk[pos[res]])res=t;}if(mid<R){t=query(L,R,mid+1,r,x<<1|1);if(rk[pos[t]]>rk[pos[res]])res=t;}return res;
}
int main(){int n,m,i,l,r,k;char s[5];scanf("%d%d",&n,&m);rk[0]=-1;insert(num());for(i=1;i<=n;i++)pos[i]=1;for(i=1;i<=n;i++)modify(i,1,n,1);while(m--){scanf("%s%d%d",s,&l,&r);if(s[0]=='C'){scanf("%d",&k);pos[k]=insert(num(pos[l],pos[r]));modify(k,1,n,1);}elseprintf("%d\n",query(l,r,1,n,1));}
}

转载于:https://www.cnblogs.com/jefflyy/p/9286077.html

[BZOJ3600]没有人的算术相关推荐

  1. bzoj3600 没有人的算术

    查询可以直接线段树维护,修改呢,考虑一颗替罪羊,每个点代表一段区间,他的$val$就是区间中值,线段树记录对应节点的$id$,再开一个数组记录即时的权值,因为重建时$val$可能会变.这好像是重量平衡 ...

  2. 基于modelsim的十个Verilog入门试验程序(1)(7人表决器+算术逻辑单元)—程序+测试代码+波形+结果分析

    内容 实验一:7人表决器的设计 实验二:算数逻辑单元的设计 实验三:JK触发器的设计 实验四:环形计数器的设计 实验五:顺序排列的设计 实验六:二进制除法器的设计 实验七:数字显示频率计的设计 实验八 ...

  3. 省选之前的未完成的计划(截至到省选)

    PLAN OF THE COMING HEOI good problems: -bzoj4823:[Cqoi2017]老C的方块 [*] -bzoj3171:[Tjoi2013]循环格 [*] -bz ...

  4. 3682: Phorni 后缀平衡树 线段树

    国际惯例的题面: 考虑如果没有强制在线我们能怎么水掉这个题,先构造出字符串,各种方法求一下后缀数组,然后线段树维护区间rank最小的位置即可. 然而他要求强制在线,支持插入后缀,并比较后缀大小(求ra ...

  5. 2019年7月训练记录(更新ing)

    前言 本月上半月训练记录可详见:2019年暑假绍兴集训. \(Jul\ 15th\) 早上到机房先做了一道一直想做的板子题:[洛谷4781][模板]拉格朗日插值,发现拉格朗日插值也并没有想象中那么难. ...

  6. c语言实验一的错误,C语言实验(三)

    第四章分支结构实验 实验项目:第四章实验设计 实验项目:4.3.1  if语句的应用 ,4.3.2  switch case的应用 ,4.3.3  switch case嵌套if语句的应用 ,4.3. ...

  7. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  8. Kill Math: 让数学不只是符号

    Kill Math: 让数学不只是符号 Author: Bret Victor / April 11, 2011 译者:神奇的战士 Bret Victor 是苹果公司的前 IPAD 的交互设计师, 大 ...

  9. 【苏格拉底言行录】 第四卷

    [第 四 卷] 『第 一 章』 苏格拉底喜欢和青年人交往:他是怎样鉴别青年人的,他希望青年人受到良好的教育,第1.2节.如果受的教育不好,青年人的意志越坚强,就越容易犯罪,第3.4节.幸福不在于财富, ...

最新文章

  1. mergesort java_归并排序详解(MergeSort)递归和非递归实现
  2. 机器学习基础-聚类算法-15
  3. 一个技术管理者的苦逼【技术管理漫谈】
  4. blender教学记录
  5. Syslog Cisco Incident
  6. 管理和维护RHCS集群
  7. Compose 1.0 即将发布,你准备好了吗?
  8. 1.ElementUI中table的sortable使用
  9. python基础代码大全-python基础代码大全
  10. 狐狸抓老鼠,为何东北向才会成功
  11. 关于DM8168中移植算法速度慢、效率低的新发现
  12. linux确定字符行,linux小计,统计文件中包含指定字符串的行数
  13. 饭卡管理系统学生E-R图
  14. c语言入门自学课件ppt,C语言入门教程ppt(434页)免费版[精品课件]
  15. FFmpeg进阶:给视频添加文字水印
  16. RealFlow在线教程翻译(5)——Shattered Glass (破碎的玻璃杯)
  17. 《互联网时代》 第八集 忧虑
  18. 修改tomcat端口号并部署项目
  19. 手机web端唤醒qq客户端以及电脑web端唤醒qq客户端
  20. 计算机专业职业理想作文400字,理想的职业400字作文

热门文章

  1. k8s中service类型
  2. DPDK vhost-user之前后端通知机制场景分析(十)
  3. 根据id去重_Person Re-ID研究综述
  4. spark python 开发环境_Eclipse配置Spark Python开发环境
  5. 笔记本电脑怎么清理灰尘_笔记本电脑维修|笔记本电脑CPU故障
  6. GSM手机SMS编码解码
  7. RESTful 规范
  8. Eclipse 无限编译Invoking 'Maven Project Builder'导致卡主
  9. 函数 —— memset() 将存放字符串的数组清空后再赋予该数组新的字符串
  10. Centos 7.x 设置Lvs+ Keepalived