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 ...
随机推荐
- Lua 基础总结
lua 数组下标从 1 开始, 不是 0 lua 逻辑运算符 与 或 非 就是英文 and or not local 局部变量 数据类型:lua是一门动态类型语言,变量没有类型,只有值才有 ...
- 怎么解决teamviewer检测商业用途无法使用的问题
https://jingyan.baidu.com/article/d5c4b52be51162da560dc517.html
- Javascript中的函数数学运算
1.Math函数与属性使用语法 Math.方法名(参数1,参数2,...); Math.属性; 说明 Math函数可以没有参数,比如Math.random()函数,或有多个参数,比如Math.max( ...
- 用74HC165读8个按键状态
源:用74HC165读8个按键状态 源:74LV165与74HC595 使用 74LV165说明: 74LV165是8位并行负载或串行输入移位寄存器,末级提供互补串行输出(Q7和Q7).并行负载(PL ...
- (java) 第二周学习总结
在java源代码中,每个变量都必须声明一种类型(type).有两种类型:primitive type和reference type.引用类型引用对象(reference to object),而基本类 ...
- Ubuntu12.04 安装adb
1.通过apt-get安装adb sudo add-apt-repository ppa:nilarimogard/webupd8 sudo apt-get update sudo apt-get i ...
- C/C++中RAND_MAX的用法
RAND_MAX是C中stdlib.h中宏定义的一个字符常量: #define RAND_MAX Ox7FFF 其值最小为32767,最大为2147483647 通常在产生随机小数时可以使用RAND_ ...
- JAVA国际化输出日期格式
1.建议控制台程序 使用 IntelliJ IDEA 创建 MAVEN项目, 不选别的选项,则为控制台程序. (其它方式创建的控制台程序可能编译不过) 2.源码如下: import java.tim ...
- 爬虫框架Scrapy之Spider
Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及 ...
- CentOS 7 SSH远程证书登陆
SSH远程证书登陆是使用"公私钥"认证的方式来进行SSH登录. 1.创建公私钥 创建方式有很多种,比如说通用ssh连接工具创建,然后把公钥上传到Server主机对应的用户目录下: ...