BZOJ 3600 替罪羊树+线段树
思路:
当然是抄的黄学长的题解啦
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 500005
int n,m,rt,R,top,id[N],mx[N],pos[N];
double a[N];char ch[11];
struct data{
int l,r;
friend bool operator>(data x,data y){
if(a[x.l]>a[y.l])return 1;
if(a[x.l]==a[y.l]&&a[x.r]>a[y.r])return 1;
return 0;
}
friend bool operator==(data x,data y){
if(x.l!=y.l||x.r!=y.r)return 0;
return 1;
}
};
struct SCTree{
int cnt,size[N],ls[N],rs[N];data v[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=0;return;}
double mv=(lv+rv)/2.0;
int mid=(l+r)>>1;k=id[mid];a[k]=mv;
build(ls[k],l,mid-1,lv,mv);
build(rs[k],mid+1,r,mv,rv);
size[k]=size[ls[k]]+size[rs[k]]+1;
}
void rebuild(int &k,double lv,double rv){
top=0;dfs(k);
build(k,1,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]=1;
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.666>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=0;
}
}
else R=k;
return p;
}
}sc;
void modify(int k,int l,int r,int v){
int mid=(l+r)>>1;
if(l==r){mx[k]=l;return;}
if(v<=mid)modify(k<<1,l,mid,v);
else modify(k<<1|1,mid+1,r,v);
int x=mx[k<<1],y=mx[k<<1|1];
mx[k]=a[pos[x]]>=a[pos[y]]?x:y;
}
int query(int k,int l,int r,int x,int y){
if(l>=x&&r<=y)return mx[k];
int mid=(l+r)>>1;
if(mid<x)return query(k<<1|1,mid+1,r,x,y);
else if(mid>=y)return query(k<<1,l,mid,x,y);
else{
int p1=query(k<<1|1,mid+1,r,x,y),p2=query(k<<1,l,mid,x,y);
return a[pos[p1]]>a[pos[p2]]?p1:p2;
}
}
int main(){
scanf("%d%d",&n,&m);
a[0]=-1;
sc.insert(rt,0,1,(data){0,0});
for(int i=1;i<=n;i++)pos[i]=1;
for(int i=1;i<=n;i++)modify(1,1,n,i);
int l,r,K;
for(int i=1;i<=m;i++){
scanf("%s%d%d",ch+1,&l,&r);
if(ch[1]=='C'){
scanf("%d",&K);
pos[K]=sc.insert(rt,0,1,(data){pos[l],pos[r]});
if(R)sc.rebuild(rt,0,1),R=0;
modify(1,1,n,K);
}
else printf("%d\n",query(1,1,n,l,r));
}
}
BZOJ 3600 替罪羊树+线段树的更多相关文章
- 「BZOJ3065」带插入区间第K小值 替罪羊树×线段树
题目描述 从前有\(n\)只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力\(a_i\).跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间\(k\)小值.他 ...
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- 浅谈树套树(线段树套平衡树)&学习笔记
0XFF 前言 *如果本文有不好的地方,请在下方评论区提出,Qiuly感激不尽! 0X1F 这个东西有啥用? 树套树------线段树套平衡树,可以用于解决待修改区间\(K\)大的问题,当然也可以用 ...
- bzoj 3600 没有人的算术 - 替罪羊树 - 线段树
题目都是图片,就不给了,就给链接好了 由于bzoj比较慢,就先给[vjudge传送门] 有兴趣的可以去逛bzoj[bzoj传送门] 题目大意 有n个数a[1],a[2],...,a[n],它们开始都是 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ.3938.Robot(李超线段树)
BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- 「BZOJ3600」没有人的算术 替罪羊树+线段树
题目描述 过长--不想发图也不想发文字,所以就发链接吧-- 没有人的算术 题解 \(orz\)神题一枚 我们考虑如果插入的数不是数对,而是普通的数,这就是一道傻题了--直接线段树一顿乱上就可以了. 于 ...
- 【BZOJ3600】没有人的算术 - 替罪羊树+线段树
题意: 题解: Orz vfleaking……真·神题 做法大概是先把题意中定义的“数”都赋一个实数权值,用平衡树来维护整个从大到小排序过的序列,再用线段树查询最值: 这样做为什么是对的?考虑插入一个 ...
- 【BZOJ3600】没有人的算术(替罪羊树+线段树)
点此看题面 大致题意: 定义任意数对\(>0\),数对之间比大小先比第一位.后比第二位,一开始数列全为\(0\),要求你支持\(a_k=(a_x,a_y)\)和询问区间最大值所在位置两种操作. ...
随机推荐
- 关于Segmentation fault错误
今天敲代码时候出现了Segmentation fault,在网上查了一些资料,基本上的原因是.非法的内存訪问. 比如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法 ...
- Azure RBAC(Roles Based Access Control)正式上线了
期盼已久的Azure RBAC(Roles Based Access Control)正式上线了. 在非常多情况下.客户须要对各种类型的用户加以区分,以便做出适当的授权决定.基于角色的訪问控制 (RB ...
- python设计模式 之 简单工厂模式
简单工厂模式属于类的创建型模式,适合用来对大量具有共同接口的类进行实例化,它能够推迟到执行的时候才动态决定要创建哪个类的实例.而不是在编译时就必须知道要实例化哪个类. python: #!/usr/b ...
- Android 开发之集成百度地图的定位与地图展示
app 应用中,大多数应用都具有定位功能,百度定位就成了开发人员的集成定位功能的首选,近期也在做定位功能,可是发现百度真是个大坑啊, sdk 命名更新了,相关代码却不更新,害得我花费了非常长时间来研究 ...
- vue引入swiper vue使用swiper vue脚手架使用swiper /引入js文件/引入css文件
vue引入swiper vue使用swiper vue脚手架使用swiper /引入js文件/引入css文件 ------------------------------------------- ...
- (转载) android项目大全,总有你所需的
目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 [置顶] android项目大全,总有你所需的 标签: 源 ...
- Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)
这题真的只能靠直觉了,我没法给出详细证明. 解题思路: 1.交换3n次或者7n+1次,一定会出现一个为奇数,另一个为偶数. 2.用最朴素的方法,将n个数字归位,计算交换次数. 3.判断交换次数是否与3 ...
- hdu1010 - dfs,奇偶剪枝
题目链接 给一个迷宫,问从起点到终点存不存在一条长度为T的路径. ------------------------------------------------------------------- ...
- vue.js---methods中一个方法调用另一个方法
new Vue({ el: '#app', data: { test:111, }, methods: { test1:function(){ alert(this.test) }, test2:fu ...
- [ZJOI2015]诸神眷顾的幻想乡 广义后缀自动机_DFS_语文题
才知道题目中是只有20个叶子节点的意思QAQ.... 这次的广义后缀自动机只是将 last 设为 1, 并重新插入. 相比于正统的写法,比较浪费空间. Code: #include <cstdi ...