bzoj 3600: 没有人的算术
Description

Solution
我们可以给每一个数钦定一个权值 , 这样就可以 \(O(1)\) 比较大小了.
考虑怎么确定权值:
用平衡树来维护 , 我们假设根节点管辖 \([1,2^{60}]\) 的数 , 根节点的右儿子都比根节点权值大 , 左儿子权值都都比根节点小
左儿子管辖 \([1,2^{59}-1]\) , 右儿子管辖 \([2^{59}+1,2^{60}]\) 这样分下去 , 但是插入可能会导致不平衡 , 使得深度过大, 不断除以 \(2\) 最后变成小数 , 导致精度误差 , 最后无法比较大小 .
于是我们就采用替罪羊树维护 , 这样就可以保证深度了 , 当某个节点 \(x\) 满足 \(max(size[lson],size[rson])>=size[x]*0.75\) 我们就暴力重构 .
询问用线段树维护 , 每个节点维护每个位置在替罪羊树上对应的节点编号 , 每一次通过查询权值就可以比较大小 .
#include<bits/stdc++.h>
#define LS (o<<1)
#define RS (o<<1|1)
#define I set<int>::iterator
using namespace std;
typedef long long ll;
const int N=1e6+10;const ll M=1ll<<60;
int n,Q,ls[N],rs[N],P;
ll w[N];int tr[N*4],id[N];
struct data{
int x,y;
inline bool operator <(const data &p)const{
return x!=p.x?w[x]<w[p.x]:w[y]<w[p.y];}
}v[N];
inline int merge(int x,int y){
return id[x]==id[y]?x:(w[id[x]]>w[id[y]]?x:y);
}
inline void build(int l,int r,int o){
if(l==r){tr[o]=l;id[l]=0;return ;}
int mid=(l+r)>>1;
build(l,mid,LS);build(mid+1,r,RS);
tr[o]=merge(tr[LS],tr[RS]);
}
inline void ins(int l,int r,int o,int sa){
if(l==r){id[l]=P;return ;}
int mid=(l+r)>>1;
if(sa<=mid)ins(l,mid,LS,sa);
else ins(mid+1,r,RS,sa);
tr[o]=merge(tr[LS],tr[RS]);
}
inline int qry(int l,int r,int o,int sa,int se){
if(sa<=l && r<=se)return tr[o];
int mid=(l+r)>>1;
if(se<=mid)return qry(l,mid,LS,sa,se);
if(sa>mid)return qry(mid+1,r,RS,sa,se);
return merge(qry(l,mid,LS,sa,mid),qry(mid+1,r,RS,mid+1,se));
}
ll _l,_r;int *t,rt=0,tt=0,sz[N],top=0,st[N];
inline void insert(ll l,ll r,int &x,data p){
ll mid=(l+r)>>1;
if(!x)x=++tt,w[x]=mid,v[x]=p;
++sz[x];
if(v[x].x==p.x && v[x].y==p.y){P=x;return ;}
if(p<v[x])insert(l,mid-1,ls[x],p);
else insert(mid+1,r,rs[x],p);
if(max(sz[ls[x]],sz[rs[x]])>sz[x]*0.75)t=&x,_l=l,_r=r;
}
inline void dfs(int x){
if(!x)return ;
dfs(ls[x]);st[++top]=x;
dfs(rs[x]);
}
inline void build(int l,int r,ll L,ll R,int &x){
int mid=(l+r)>>1;
x=st[mid],w[x]=(L+R)>>1,ls[x]=rs[x]=0;
if(l<mid)build(l,mid-1,L,w[x]-1,ls[x]);
if(mid<r)build(mid+1,r,w[x]+1,R,rs[x]);
sz[x]=sz[ls[x]]+sz[rs[x]]+1;
}
inline void Insert(data p){
t=NULL,insert(1,M,rt,p);
if(t!=NULL){
top=0;
dfs(*t);build(1,top,_l,_r,*t);
}
}
int main(){
freopen("calc.in","r",stdin);
freopen("calc.out","w",stdout);
cin>>n>>Q;
build(1,n,1);
char op[2];int x,y,k;
while(Q--){
scanf("%s%d%d",op,&x,&y);
if(op[0]=='C'){
Insert((data){id[x],id[y]});
scanf("%d",&k);
ins(1,n,1,k);
}
else printf("%d\n",qry(1,n,1,x,y));
}
return 0;
}
bzoj 3600: 没有人的算术的更多相关文章
- bzoj 3600 没有人的算术 - 替罪羊树 - 线段树
题目都是图片,就不给了,就给链接好了 由于bzoj比较慢,就先给[vjudge传送门] 有兴趣的可以去逛bzoj[bzoj传送门] 题目大意 有n个数a[1],a[2],...,a[n],它们开始都是 ...
- bzoj 3600 没有人的算术——二叉查找树动态标号
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3600 已知 l 和 r 的排名,想快速知道 k 的排名.那么建一个 BIT ,用已知的排名做 ...
- 【题解】BZOJ 3600: 没有人的算术——替罪羊树、线段树
题目传送门 题意 具体的自己去上面看吧...反正不是权限题. 简单来说,就是定义了一类新的数,每个数是0或者为 \((x_L, x_R)\) ,同时定义比较大小的方式为:非零数大于零,否则按字典序比较 ...
- 「BZOJ3600」没有人的算术 替罪羊树+线段树
题目描述 过长--不想发图也不想发文字,所以就发链接吧-- 没有人的算术 题解 \(orz\)神题一枚 我们考虑如果插入的数不是数对,而是普通的数,这就是一道傻题了--直接线段树一顿乱上就可以了. 于 ...
- BZOJ 2055: 80人环游世界 [上下界费用流]
2055: 80人环游世界 题意:n个点带权图,选出m条路径,每个点经过val[i]次,求最小花费 建图比较简单 s拆点限制流量m 一个点拆成两个,限制流量val[i],需要用上下界 图中有边的连边, ...
- bzoj 2055 80人环游世界
有源汇上下界最小费用可行流. 将每个国家拆点. 源点向一个新建节点连一条上界为总人数下界为0费用为0的边. 新建节点向每个国家的入点连一条上界为正无穷下界为0费用为0的边. 每个国家的入点向出点连一条 ...
- bzoj 2055: 80人环游世界 -- 上下界网络流
2055: 80人环游世界 Time Limit: 10 Sec Memory Limit: 64 MB Description 想必大家都看过成龙大哥的<80天环游世界>,里面 ...
- BZOJ 2055 80人环游世界 有上下界最小费用可行流
题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...
- BZOJ 2055: 80人环游世界(有上下界的费用流)
题面 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 693 Solved: 434 [Submit][Status][Discuss] Descript ...
随机推荐
- java keytool生成ssl加密密钥
教程:http://www.cnblogs.com/getherBlog/p/3930317.html 其中用到几个命令: keytool -genkeypair -alias certificate ...
- Django:上传文件或者图片时request.FILES的值为空
在form表单中加上属性 enctype="multipart/form-data"
- asp.net—策略模式
一.什么是策略模式 定义:定义一系列算法,把一个个算法封装成独立类并实现同一个接口,使得它们之间可以相互替换. 二.怎么使用策略模式 首先模拟一个场景:有一个用户想买车. 可以有多种方式买车: (1 ...
- mySql数据库 C#使用guid
CHAR(36) 如果某列设置为CHAR(36),则MySQL官方的连接器会将其当成 GUID 类型.实际上,有时候 某个字段碰巧设为可CHAR(36), 但是我们的本意并非当它是GUID. varc ...
- 构造回文-C++实现
腾讯2017暑期实习生招聘笔试题……做了一个世纪才做出来 //腾讯2017暑期实习生招聘第一道题.做了一个世纪才做出来………………太菜了 /** 题目: 给定一个字符串s,你可以从中删除一些字符,使得 ...
- 如何将Spring Boot项目打包部署到外部Tomcat
1.项目打包 项目开发结束后,需要打包部署到外部服务器的Tomcat上,主要有几种方式. (1)生成jar包 cd 项目跟目录(和pom.xml同级)mvn clean package## 或 ...
- 学习《精通数据科学从线性回归到深度学习》PDF+代码分析
数据科学内容广泛,涉及到统计分析.机器学习以及计算机科学三方面的知识和技能.学习数据科学,推荐学习<精通数据科学从线性回归到深度学习>. 针对技术书籍,最好的阅读方法是对照每一章的示例代码 ...
- Good Bye 2017 C. New Year and Curling
Carol is currently curling. She has n disks each with radius r on the 2D plane. Initially she has al ...
- Flask从入门到精通之在视图函数中处理表单
在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据.更新后的index() 视图函数如下: @app.route('/') def index(): name = ...
- Hadoop2.2.0安装笔记
最近想学习hadoop,于是网上找了些教程学习,几经周折,总算安装成功了! 先讲下环境,就2台机器...都是vmware虚拟机,操作系统centos, jdk版本 1.8.0 hadoop版本 2.2 ...