错误记录:如下注释语句

 #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 ;
}

最新文章

  1. silverlight使用小计(先做记录后续整理)
  2. Android通用流行框架大全
  3. jquery编写插件的方法
  4. Leetcode: Matchsticks to Square &amp;&amp; Grammar: reverse an primative array
  5. Linux centos关机与重启命令详解与实战
  6. 时刻注意QT与Windows系统的不同(惨痛教训)
  7. Spring 读取XML配置文件的两种方式
  8. JS中的普通函数和箭头函数
  9. C语言编码风格_集锦_1
  10. iOS启动图-从网络获取的gif图,在本地一直是没有动画,还模糊的
  11. hdu1005 Number Sequence---找循环节
  12. vue原理简介
  13. java----重载
  14. 关于Windows下无法在MySQL安装目录找到配置文件my.ini
  15. ROC,AUC,Precision,Recall,F1的介绍与计算
  16. Windows:C:\Windows\System32\drivers\etc\hosts
  17. 反转ListBox的ListBoxItem(控件级别,不是数据的反转)
  18. R函数-时间序列ETS参数说明
  19. 6/5 sprint2 看板和燃尽图的更新
  20. IntelliJ IDEA 里 查看一个函数注释的方法是 ctrl+q

热门文章

  1. 利用NSA的MS17-010漏洞利用工具实现Win 7和Win Server 2008系统入侵
  2. ArcGIS Engine 10.2 如何发布服务
  3. UVA 4857 Halloween Costumes 区间背包
  4. java中 ++前后差别试题及静态变量一旦赋值不可改变
  5. Ubuntu14.04 64bit下Caffe + CUDA 6.5安装详细步骤
  6. 为Html.EditorForModel自定义模版
  7. asp.net项目与开源单点登录项目CAS的结合
  8. ALLOWED_HOSTS = [&#39;*&#39;]
  9. hexSHA1散列加密解密(不可逆)
  10. HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法