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 ...
随机推荐
- Jupyter Notebook 基本使用
Jupyter 官网 IPython Interactive Computing IPython Notebook使用浏览器作为界面,向后台的IPython服务器发送请求,并显示结果.在浏览器的界面中 ...
- Linux 常用检测命令
1.uptime [root@smgsim02 ~]# uptime 15:08:15 up 98 days, 4:19, 2 users, load average: 0.07, 0.29, ...
- Bound mismatch: The typae CertificateDirectory is not a valid substitute for the bounded parameter <M extends Serializable>
这是因为架包没导对或者关联的项目不是在同一个工作空间.
- vue-cli3取掉eslint格式提示报错
把package.json文件中关于eslint那个直接去掉. "@vue/cli-plugin-eslint": "^3.7.0",
- Python中的shelve模块
shelve中有用的函数就是open(),但是下面编写的数据库函数中调用路径是经常出错,如果直接调用一个从来没有用过的文件却能正常运行,暂时没有找出原因. 调用shelve.open()会返回一个sh ...
- Solr 文章集成
Solr 文章集成 solr原理 solr wiki: http://wiki.apache.org/solr/ 分布式全文检索系统SolrCloud简单介绍 http://my.oschina.ne ...
- JavaScript-创建第一个自己的类库
通过上一节面向对象和原型的学习. 我们知道了怎样创建一个类,包含类的私有化属性和方法.公有化属性和方法.静态属性和方法.在这里略微回想一下.首先要创建一个类能够通过1.new object().2.利 ...
- 在类的头文件里尽量少引入其它头文件 <<Effective Objective-C>>
与C 和C++ 一样,Objective-C 也使用"头文件"(header file) 与"实现文件"(implementation file)来区隔代码.用 ...
- jquery源码学习笔记一:总体结构
练武不练功,到老一场空.计算机也一样. 计算机的功,就是原理.如果程序员只会使用各种函数,各种框架,而不知其原理,顶多熟练工人而已.知其然,更要知其所以然. jquery我们用得很爽,但它究竟咋实现的 ...
- bash builtin eval
1 在开始执行eval后面的命令之前eval主要做了哪些事情 1.1 去掉反斜杠的quoting 比如\$ac_optarg,会变成$ac_optarg. 1.2 去掉单引号的quoting 比如: ...