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 ...
随机推荐
- java虚拟机-垃圾回收算法
在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.但是首先需要明确,什么样的对象才能当为垃圾: 1.引用计数法:如果某个引用(即指针)指向对象,那么说明该对象还 ...
- request.getQueryString()代表的含义
在jsp做分页的时候,有时候我们想获取get请求链接中的参数保留下来. 比如客户端发送 http://localhost/test.do?a=b&c=d&e=f 通过request.g ...
- Ubuntu16.04 Docker 安装
前提条件 Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker. 通过 uname -r 命令查看你当前的内核版本 ...
- kernel command line 参数详解
Linux内核在启动的时候,能接收某些命令行选项或启动时参数.当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核. 如果不使用启动管 ...
- SVN一直提示需要clean up
无论到那一级都提示clean up, 这是陷入clean up 死循环的结果. 解决办法: 使用任何一款可以连sqllit 的数据库管理软件例如(Navicat Premium),连入 项目跟目录/. ...
- Linux下ping命令参数详细解析
-a Audible ping. #Audible ping. -A Adaptive ping. Interpacket interval adapts to round-trip time, so ...
- hadoop随手笔记
1.Hadoop Streaming 是为了方便不太熟悉java用户编写MR程序的工具.用户可以将任何可执行文件(C++)或者脚本(python,ruby)作为Mapper/Reducer, 提高了效 ...
- TCP协议三次握手过程分析(改)
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- .NET Framework 系统要求
.NET Framework 3.5对操作系统的要求 .NET Framework 4 对操作系统的要求 .NET Framework 4.5对操作系统的要求
- Adobe HTTP Dynamic Streaming (HDS) manifest 文件 f4m bootstrap属性解析
首先介绍一下应用背景,我们使用的很多浏览器都依赖Adobe Flash Player 播放视频文件.Flash Player是一个播放的客户端,客户端和服务端之间的流通信有几套实现的标准.包括这里介绍 ...