bzoj3600
题解:
好像是什么替罪羊树
然后看了几个题解
然后就抄了一边
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,rt,R,mx[N],pos[N],id[N],top;
double a[N];
char ch[];
struct data
{
int l,r;
friend bool operator>(data x,data y)
{
if (a[x.l]>a[y.l])return ;
if (a[x.l]==a[y.l]&&a[x.r]>a[y.r])return ;
return ;
}
friend bool operator==(data x,data y)
{
if (x.l!=y.l||x.r!=y.r)return ;
return ;
}
};
struct sctree
{
data v[N];
int cnt,size[N],ls[N],rs[N];
void dfs(int k)
{
if(!k)return;
dfs(ls[k]);
id[++top]=k;
dfs(rs[k]);
}
void build(int &k,int l,int r,double lv,double rv)
{
if(l>r){k=;return;}
double mv=(lv+rv)/2.0;
int mid=(l+r)/;
k=id[mid];a[k]=mv;
build(ls[k],l,mid-,lv,mv);
build(rs[k],mid+,r,mv,rv);
size[k]=size[ls[k]]+size[rs[k]]+;
}
void rebuild(int &k,double lv,double rv)
{
top=;
dfs(k);
build(k,,top,lv,rv);
}
int insert(int &k,double lv,double rv,data val)
{
double mv=(lv+rv)/2.0;
if (!k)
{
k=++cnt;a[k]=mv;v[k]=val;size[k]=;
return k;
}
int p;
if (val==v[k])return k;
else
{
size[k]++;
if (val>v[k])p=insert(rs[k],mv,rv,val);
else p=insert(ls[k],lv,mv,val);
}
if (size[k]*0.75>max(size[ls[k]],size[rs[k]]))
{
if (R)
{
if(ls[k]==R)rebuild(ls[k],lv,mv);
else rebuild(rs[k],mv,rv);
R=;
}
}
else R=k;
return p;
}
}sc;
void modify(int k,int l,int r,int v)
{
int mid=(l+r)>>;
if (l==r){mx[k]=l;return;}
if (v<=mid)modify(k<<,l,mid,v);
else modify(k<<|,mid+,r,v);
int x=mx[k<<],y=mx[k<<|];
if (a[pos[x]]>=a[pos[y]])mx[k]=x;
else mx[k]=y;
}
int query(int k,int l,int r,int x,int y)
{
int mid=(l+r)>>;
if (l==x&&y==r)return mx[k];
int t=,p=;
if (x<=mid)
{
p=query(k<<,l,mid,x,min(mid,y));
if (a[pos[p]]>a[pos[t]])t=p;
}
if (y>mid)
{
p=query(k<<|,mid+,r,max(x,mid+),y);
if(a[pos[p]]>a[pos[t]])t=p;
}
return t;
}
int main()
{
scanf("%d%d",&n,&m);
a[]=-;
sc.insert(rt,,,(data){,});
for (int i=;i<=n;i++)pos[i]=;
for (int i=;i<=n;i++)modify(,,n,i);
int l,r,K;
for (int i=;i<=m;i++)
{
scanf("%s%d%d",ch+,&l,&r);
if (ch[]=='C')
{
scanf("%d",&K);
pos[K]=sc.insert(rt,,,(data){pos[l],pos[r]});
if(R)sc.rebuild(rt,,);R=;
modify(,,n,K);
}
else printf("%d\n",query(,,n,l,r));
}
return ;
}
bzoj3600的更多相关文章
- bzoj3600: 没有人的算术
题意:太难说了..手动去看吧反正不是权限题. 膜拜VFK大爷的神题! 其实一开始思路挺清楚的,如果我们能做到用一个实数去代表"数",这就是裸的动态区间最值查询. 关键是怎么用实数去 ...
- BZOJ3600:没有人的算术
传送门 如果能给每个 \(pair\) 按照权值编号就好了 假设之前已经有了所有的权值的编号,现在考虑编号新的 \(pair\) 如果看过了陈立杰的论文的话,不难得到一个重量平衡树的做法 给树上每个子 ...
- [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]
题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...
- 「BZOJ3600」没有人的算术 替罪羊树+线段树
题目描述 过长--不想发图也不想发文字,所以就发链接吧-- 没有人的算术 题解 \(orz\)神题一枚 我们考虑如果插入的数不是数对,而是普通的数,这就是一道傻题了--直接线段树一顿乱上就可以了. 于 ...
- 【BZOJ3600】没有人的算术 - 替罪羊树+线段树
题意: 题解: Orz vfleaking……真·神题 做法大概是先把题意中定义的“数”都赋一个实数权值,用平衡树来维护整个从大到小排序过的序列,再用线段树查询最值: 这样做为什么是对的?考虑插入一个 ...
- 【BZOJ3600】没有人的算术(替罪羊树+线段树)
点此看题面 大致题意: 定义任意数对\(>0\),数对之间比大小先比第一位.后比第二位,一开始数列全为\(0\),要求你支持\(a_k=(a_x,a_y)\)和询问区间最大值所在位置两种操作. ...
- shanquan2的两年三题系列
好像只有2个月就退役啦 不管了,先说一下哪三题:多点求值.lcm.替罪羊树(bzoj3065) [upd0]2016.3.29 多点求值A掉啦,myy卡常数sxbk(不是说好的是shanquan2出的 ...
- 3682: Phorni 后缀平衡树 线段树
国际惯例的题面: 考虑如果没有强制在线我们能怎么水掉这个题,先构造出字符串,各种方法求一下后缀数组,然后线段树维护区间rank最小的位置即可.然而他要求强制在线,支持插入后缀,并比较后缀大小(求ran ...
随机推荐
- ubuntu下python+tornado+supervisor+nginx部署
由于项目需要,老师让我写一个小web系统,之前都是用java写web,想到自己最近学机器学习要用python,所以用python来写一下,此外,因为想用点新东西,也介于程序比较小,所以考虑用mongo ...
- 切换usb口的命令
open:dd if=imx6dl-sabresd-usboc.dtb of=/dev/mmcblk0 bs=512 seek=1536 conv=fsyncclose:dd if=imx6dl-sa ...
- [转]总结一下CSS中的定位 Position 属性
在CSS中,Position 属性经常会用到,主要是绝对定位和相对定位,简单的使用都没有问题,尤其嵌套起来,就会有些混乱,今记录总结一下,防止久而忘之. CSS position 属性值: absol ...
- GIT使用—分支与合并
一.分支名 分支名不能以斜线结尾 分支名不能以减号开头 以斜杠分割的组件不能以点开头(feature/.new) 分支名的任何地方都不能包含连个连续的点 分支名不能包含空格或空白符 分支名不能包含波浪 ...
- SeekArc
https://github.com/neild001/SeekArc https://github.com/imflyn/SeekArc
- 20145329 《Java程序设计》第七周学习总结
教材学习内容总结 +JDK出现之前就已经存在的java.util.Date与java.util.Calendar等API +如果想取得系统时间,方法之一是使用System.currentTimeMil ...
- 2_jenkins_git创建创建及项目构建
确保jenkins服务正常工作 进入WEB界面 查看git插件是否正常安装 "管理系统" --> "管理插件" "可选插件" 然后找到 ...
- MySQL级联删除和级联修改
1.新建主键table create table demo1_zhujian ( id int primary key auto_increment, name )); 2.新建外键table cre ...
- install opencv
OpenCV是一个基于开源发行的跨平台计算机视觉库,它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉 ...
- P4Lang Repository: Switch
Github Switch Introduction Structure: +-----+ +-----+ +-----+ +-----+ |App a| |App j| |App n| |App z ...