Tree CodeForces -932D
错误记录:如下注释语句
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
LL log2n=,cnt=;
LL anc[][],maxv[][],v[];
LL anc2[][],sum[][];
LL pow2[]={,,,,,,,,,,,,,,,,,,,};
//maxv[i][j]指i到其2^j级祖先的路径上点权最大值,含2^j级祖先,不含i
//sum[i][j]指i到其2^j级祖先的路径上点权之和,含祖先,不含i
LL Q,last;
int main()
{
LL i,idx,p,q,t,ans;
v[]=1e15+;
for(i=;i<=log2n;i++) maxv[][i]=maxv[][i]=sum[][i]=sum[][i]=1e15+;
scanf("%lld",&Q);
while(Q--)
{
scanf("%lld%lld%lld",&idx,&p,&q);
p^=last;q^=last;
//printf("%lld %lld\n",p,q);
if(idx==)
{
v[++cnt]=q;anc[cnt][]=p;maxv[cnt][]=v[anc[cnt][]];
//putchar('a');printf("%d %d ",0,maxv[cnt][0]);
for(i=;i<=log2n;i++)
{
anc[cnt][i]=anc[anc[cnt][i-]][i-];
maxv[cnt][i]=max(maxv[cnt][i-],maxv[anc[cnt][i-]][i-]);
//printf("%d %d ",i,maxv[cnt][i]);
}
//putchar('b');
for(t=cnt,i=log2n;i>=;i--)
if(maxv[t][i]<v[cnt])
t=anc[t][i];
anc2[cnt][]=anc[t][];sum[cnt][]=v[anc2[cnt][]];
//printf("%d %d\n",cnt,nxt[cnt]);
//printf("%lld %lld ",0LL,sum[cnt][0]);
for(i=;i<=log2n;i++)
{
anc2[cnt][i]=anc2[anc2[cnt][i-]][i-];
sum[cnt][i]=sum[cnt][i-]+sum[anc2[cnt][i-]][i-];
//printf("%lld %lld ",i,sum[cnt][i]);
}
//putchar('c');
}
else
{
q-=v[p];ans=;if(q<){ans=;goto xxx;}
for(t=p,i=log2n;i>=;i--)
if(sum[t][i]<=q)
{
//t=anc2[t][i];
q-=sum[t][i];ans+=pow2[i];//ans++
t=anc2[t][i];
}
xxx:last=ans;
printf("%lld\n",ans);
}
}
return ;
}
另外,不能看到要加点就想动态树(不会)什么的,比如这道题,虽然要加点,但是仅此而已,用不到那些东西,只需要加入点时倍增求出要维护的值就行了。
对于原树,每加入一个节点u求出maxv(含义见程序),然后由这个新节点u向上倍增找到其祖先节点v,使得u到v的路径上所有点(不含u,含v)权值的最大值小于u的权值,且v深度最小。那么v的父节点就是u向上一级一级跳时第一个能访问到的权值大于等于u的节点,记为nxt[u](程序中省略,直接记为anc2[u][0])。
这样子,对于每个节点u(除了1号)都能得到nxt[u],把nxt[u]当做u的父节点,形成一棵新的树,那么查询转化为给定一个节点u,在新树上找到u的祖先节点v,使得u到v的路径上所有点(含u和v)权值之和小于等于x,且v的深度最小,输出u到v的路径上点数(含u和v)。(当然也可能u的权值就超过x了,那么输出0,要特判)。仍然倍增解决即可。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
LL log2n=,cnt=;
LL anc[][],maxv[][],v[];
LL anc2[][],sum[][];
//maxv[i][j]指i到其2^j级祖先的路径上点权最大值,含2^j级祖先,不含i
//sum[i][j]指i到其2^j级祖先的路径上点权之和,含祖先,不含i
LL Q,last;
int main()
{
LL i,idx,p,q,t,ans;
v[]=1e15+;
for(i=;i<=log2n;i++) maxv[][i]=maxv[][i]=sum[][i]=sum[][i]=1e15+;
scanf("%lld",&Q);
while(Q--)
{
scanf("%lld%lld%lld",&idx,&p,&q);
p^=last;q^=last;
if(idx==)
{
v[++cnt]=q;anc[cnt][]=p;maxv[cnt][]=v[anc[cnt][]];
for(i=;i<=log2n;i++)
{
anc[cnt][i]=anc[anc[cnt][i-]][i-];
maxv[cnt][i]=max(maxv[cnt][i-],maxv[anc[cnt][i-]][i-]);
}
for(t=cnt,i=log2n;i>=;i--)
if(maxv[t][i]<v[cnt])
t=anc[t][i];
anc2[cnt][]=anc[t][];sum[cnt][]=v[anc2[cnt][]];
for(i=;i<=log2n;i++)
{
anc2[cnt][i]=anc2[anc2[cnt][i-]][i-];
sum[cnt][i]=sum[cnt][i-]+sum[anc2[cnt][i-]][i-];
}
}
else
{
q-=v[p];ans=;if(q<){ans=;goto xxx;}
for(t=p,i=log2n;i>=;i--)
if(sum[t][i]<=q)
{
q-=sum[t][i];ans+=(1LL<<i);
t=anc2[t][i];
}
xxx:last=ans;
printf("%lld\n",ans);
}
}
return ;
}
Tree CodeForces -932D的更多相关文章
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- Distance in Tree CodeForces - 161D
Distance in Tree CodeForces - 161D 题意:给一棵n个结点的树,任意两点之间的距离为1,现在有点u.v,且u与v的最短距离为k,求这样的点对(u,v)的个数((u,v) ...
- Water Tree CodeForces 343D 树链剖分+线段树
Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...
- Z - New Year Tree CodeForces - 620E 线段树 区间种类 bitset
Z - New Year Tree CodeForces - 620E 这个题目还没有写,先想想思路,我觉得这个题目应该可以用bitset, 首先这个肯定是用dfs序把这个树转化成线段树,也就是二叉树 ...
- Codeforces 932D - Tree
932D - Tree 思路: 树上倍增 anc[i][u]:u的2^i祖先 mx[i][u]:u到它的2^i祖先之间的最大值,不包括u pre[i][u]:以u开始的递增序列的2^i祖先 sum[i ...
- C - Ilya And The Tree Codeforces Round #430 (Div. 2)
http://codeforces.com/contest/842/problem/C 树 dp 一个数的质因数有限,用set存储,去重 #include <cstdio> #includ ...
- AC日记——Propagating tree Codeforces 383c
C. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- B. Grow The Tree Codeforces Round #594 (Div. 2)
Gardener Alexey teaches competitive programming to high school students. To congratulate Alexey on t ...
- Vasya and a Tree CodeForces - 1076E (线段树 + dfs)
题面 Vasya has a tree consisting of n vertices with root in vertex 1. At first all vertices has 0 writ ...
随机推荐
- 解决Coldfusion连接MySQL数据库的问题
在连接MySQL时,出现了如下错误: Connections to MySQL Community Server are not supported. Please contact MySQL to ...
- Edmonds 开花算法
Edmonds 开花算法 input: 图G,匹配M,未饱和点u idea: 查找从 u 開始的 M-交错路径.对每一个顶点记录父亲节点. 发现花朵.则收缩. 维护 S 和 T.S 表示沿着已经饱和的 ...
- java File_encoding属性
今天给客户发版本号,突然发现报表导出内容为空,大小0字节.感到很奇怪,由于开发的时候都好好的,打包出来怎么会出现异常. 细看才后发现是 file_encoding这个java系统属性编码方式设置导致的 ...
- LINQ体验(1)——Visual Studio 2008新特性
一.写本系列的目的 我平时利用课余零碎时间来学习ASP.NET3.5.LINQ.Silverlight.ASP.NET 3.5 Extensions等新东西,通过笔记形式来记录自己所学的历 程.也给大 ...
- C 编程中fseek、ftell的用法总结
fseek 函数功能是将文件指针移动到指定的地方,因此可以通过fseek重置文件指针的位置.函数原型: int fseek(FILE *stream, long offset, int origi ...
- VisualSVN Server的配置和使用
VisualSVN Server的配置与使用 本版本为VisualSVN Server 2.7.3版本-不同的版本可能在设置有不同的差异,但都大同小异 1.1启动界面 安装好 VisualSVN Se ...
- CentOS 7下修改rabbitmq打开文件数量方法
以下为使用systemd的修改方法: 1.系统层修改: 通过修改sysctl配置,提高系统的打开文件数量 vim /etc/sysctl.conf,添加: fs.file-max = 65535 ...
- codeforces 686B B. Little Robber Girl's Zoo(水题)
题目链接: B. Little Robber Girl's Zoo //#include <bits/stdc++.h> #include <vector> #include ...
- 一.C语言:关键字、标识符和注释
一.关键字 C语言提供的有特殊含义的符号,共32个. 在Xcode中关键字全部高亮显示,关键字全部都为小写.如return.int等. 二.标识符 定义:标识符是程序员在程序中自定义的一些符号和名 ...
- Violet蒲公英
传送门 题目要求求出给定区间内编号最小的众数,强制在线. 虽然说这是个黑题……不过我们可以用暴力分块解决它.首先先对所有数离散化,这个不影响众数.我们先预处理出每个数在前i个块内出现了多少次,再预处理 ...