2016vijos 6-1 松鼠聚会(LCA+卡空间)

求LCA,N=1e6,原空间限制8MB
求LCA需要深度,需要跳跃一定距离的祖先,需要父节点
把一个整数压成3个char,f[]存父节点
g[],深度为奇数的点存往上跳576步能到的点,深度为偶数的点存深度
如果深度为奇数的点要求它的深度,求他父节点的深度+1
如果深度为偶数的点要求它往上跳576步的祖先,先往上跳一步,变成奇数深度
如何求往上跳576步的祖先?
1、往上跳6次1步,g就存的往上跳6步的祖先
2、往上跳6次6步,g就存的往上跳36步的祖先
3、往上跳4次36步,g就存的往上跳144步的祖先
4、往上跳4次144步,g就存的往上跳576步的祖先
还有,不能开iostream库,不然爆空间。。。
#include<cstdio> using namespace std; #define N 1000001 const int D=; struct node
{
char a,b,c;
}f[N],g[N]; inline int F(int i)
{
return ((f[i].a<<)+f[i].b<<)+f[i].c;
} inline int G(int i)
{
return ((g[i].a<<)+g[i].b<<)+g[i].c;
} inline int d(int i)
{
return G(i)<N ? G(i):G(F(i))+;
} void read(int &x)
{
x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') { x=x*+c-''; c=getchar(); }
} node turn(int x)
{
node y;
y.a=x>>;
y.b=(x>>)&;
y.c=x&;
return y;
} int lca(int x,int y)
{
int u;
if(d(x)<d(y)) u=x,x=y,y=u;
int dis=d(x)-d(y);
while(dis>=D)
{
if(G(x)<N) x=F(x),dis--;
else x=G(x)-N,dis-=D;
}
while(dis) x=F(x),dis--;
while(x!=y)
{
if(G(x)<N||G(x)==G(y)) x=F(x),y=F(y);
else x=G(x)-N,y=G(y)-N;
}
return x;
} int main()
{
freopen("squirrel.in","r",stdin);
freopen("squirrel.out","w",stdout);
int n,m;
read(n); read(m);
g[]=turn(N);
int x;
for(int i=;i<=n;++i)
{
read(x);
f[i]=turn(x),g[i]=turn(G(F(i))+);
}
for(int i=n;i;i--)
if(G(i)&)
{
x=i;
for(int j=;j<=;++j) x=F(x);
g[i]=turn(x+N);
}
for(int i=n;i;i--)
if(G(i)>N)
{
x=i;
for(int j=;j<=;++j) x=G(x)-N;
g[i]=turn(x+N);
}
for(int i=n;i;i--)
if(G(i)>N)
{
x=i;
for(int j=;j<=;++j) x=G(x)-N;
g[i]=turn(x+N);
}
for(int i=n;i;i--)
if(G(i)>N)
{
x=i;
for(int j=;j<=;++j) x=G(x)-N;
g[i]=turn(x+N);
}
int y;
while(m--)
{
read(x); read(y);
printf("%d\n",lca(x,y));
}
}
2016vijos 6-1 松鼠聚会(LCA+卡空间)的更多相关文章
- [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1318 Solved: 664[Submit][Stat ...
- bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)
题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...
- BZOJ3170: [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 531 Solved: 249[Submit][Statu ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )
题目的距离为max(|x1-x2|, |y1-y2|) (切比雪夫距离). 切比雪夫距离(x, y)->曼哈顿距离((x+y)/2, (x-y)/2) (曼哈顿(x, y)->切比雪夫(x ...
- BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和
BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...
- 获取sd卡空间大小和获取sd卡目录
获取sd卡空间大小 TextView tv_total_size = (TextView)findViewById(R.id.textView1); TextView tv_useable_size ...
- 洛谷P3964 [TJOI2013]松鼠聚会 [二分答案,前缀和,切比雪夫距离]
题目传送门 松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示, ...
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...
随机推荐
- 【BZOJ1211】【HNOI2004】树的计数 prufer序列
题目描述 给你\(n\)和\(n\)个点的度数,问你有多少个满足度数要求的生成树. 无解输出\(0\).保证答案不超过\({10}^{17}\). \(n\leq 150\) 题解 考虑prufer序 ...
- 在VS中安装nuget离线包nupkg文件
1.下载 nupkg文件 2.打开VS,工具,选项,如下图,复制右侧圈圈地址,把下载文件复制丢进去 3.管理当前解决方案的nuget包 n 4.左侧选择你下载的包名,在右侧选择需要安装在哪一层项目,点 ...
- 爬虫_微信小程序社区教程(crawlspider)
照着敲了一遍,,, 需要使用"LinkExtrator"和"Rule",这两个东西决定爬虫的走向. 1.allow设置规则的方法:要能够限制在我们想要的url上 ...
- linux中$#,$0,$1,$2,$@,$*,$$,$?的含义
$# 是传给脚本的参数个数$0 是脚本本身的文件名$1 是脚本后接的第一个参数$2 是脚本后接的第二个参数$@ 是传给脚本的所有参数列表,"$1" "$2" & ...
- 【BZOJ5197】Gambling Guide (最短路,期望)
[BZOJ5197]Gambling Guide (最短路,期望) 题面 BZOJ权限题 洛谷 题解 假设我们求出了每个点的期望,那么对于一个点,只有向期望更小的点移动的时候才会更新答案. 即转移是: ...
- 构建SSH服务
什么是SSH?简单说,SSH是一种网络协议,用于计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露.最 ...
- cf366C Dima and Salad (dp)
是一个01分数规划的形式,只不过已经帮你二分好了. 把b乘过去,再减回来,找和等于0的a的最大值就行了 #include<bits/stdc++.h> #define pa pair< ...
- LNOI2014LCA(树链剖分+离线操作+前缀和)
题意:给一棵有根树,有多组询问,询问为l r z,求下标为l到r之间的点和z的lca的深度和. 如果我们一个一个求.emmmmm... 考虑答案怎么产生,仔细想一想,如果我们把l到r的所有点到根都加上 ...
- empty() 与 html("") 的区别
empty,首先循环给后代元素移除绑定.清除jquery给此dom的cache,然后循环removeFirstChild. 而html(''),则是简单暴力的设置innerHTML = ''; 查看文 ...
- QML学习笔记(三)-引入Font-awesome
作者: 狐狸家的鱼 Github: 八至 1.首先得在qml文件夹下建立字体文件,将font-awesome放入进去 2.然后在main.cpp中注册字体 引入中一定要写上 引用字体 引用字体得路径一 ...