#2011. 「SCOI2015」情报传递

思路:

  可持久化树状数组模板;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
#define maxm maxn*100
int deep[maxn],f[maxn],id[maxn],top[maxn],cnt,soot;
int head[maxn],V[maxn],E[maxn],lar[maxn],size[maxn];
int val[maxm],root[maxn],ch[maxm][],tot,Tl,Tr,n,m,Ans;
inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'')Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
void build(int &now,int l,int r)
{
now=++tot;
if(l==r) return;int mid=l+r>>;
build(ch[now][],l,mid);
build(ch[now][],mid+,r);
}
void add(int &now,int pre,int l,int r,int to,int x)
{
now=++tot,val[now]=val[pre]+x;
if(l==r) return;int mid=l+r>>;
if(to<=mid) add(ch[now][],ch[pre][],l,mid,to,x),ch[now][]=ch[pre][];
else add(ch[now][],ch[pre][],mid+,r,to,x),ch[now][]=ch[pre][];
}
int lowbit(int x)
{
return x&(-x);
}
void add(int to1,int to2,int x)
{
while(to1<=n) add(root[to1],root[to1],,m,to2,x),to1+=lowbit(to1);
}
void dfs1(int now)
{
deep[now]=deep[f[now]]+,size[now]=;
for(int i=head[now];i;i=E[i])
{
dfs1(V[i]),size[now]+=size[V[i]];
if(size[lar[now]]<size[V[i]]) lar[now]=V[i];
}
}
void dfs2(int now,int chain)
{
top[now]=chain,id[now]=++cnt;
root[id[now]]=root[];
if(lar[now])
{
dfs2(lar[now],chain);
for(int i=head[now];i;i=E[i])
{
if(V[i]==lar[now]) continue;
dfs2(V[i],V[i]);
}
}
}
int query(int now,int l,int r)
{
if(l>=Tl&&r<=Tr) return val[now];
int mid=l+r>>,res=;
if(Tl<=mid) res+=query(ch[now][],l,mid);
if(Tr>mid) res+=query(ch[now][],mid+,r);
return res;
}
int query(int l,int r)
{
l--;int res=;
while(r) res+=query(root[r],,m),r-=lowbit(r);
while(l) res-=query(root[l],,m),l-=lowbit(l);
return res;
}
int query(int x,int y,int tl,int tr)
{
int res=;Tl=tl,Tr=tr;
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) res+=query(id[top[y]],id[y]),y=f[top[y]];
else res+=query(id[top[x]],id[x]),x=f[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
res+=query(id[x],id[y]);
return res;
}
int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]>deep[top[y]]) x=f[top[x]];
else y=f[top[y]];
}
return deep[x]<deep[y]?deep[x]:deep[y];
}
int main()
{
freopen("data.txt","r",stdin);
freopen("data.out","w",stdout);
in(n);int op,u,v,c;
for(int i=;i<=n;i++)
{
in(f[i]);
if(!f[i]) soot=i;
else E[i]=head[f[i]],V[i]=i,head[f[i]]=i;
}
in(m);
build(root[],,m),dfs1(soot),dfs2(soot,soot);
for(int i=;i<=m;i++)
{
in(op);
if(op==)in(u),add(id[u],i,);
else
{
in(u),in(v),in(c),Ans=deep[u]+deep[v]-*lca(u,v)+;
printf("%d ",Ans);
if(i-c->=) printf("%d\n",query(u,v,,i-c-));
else printf("0\n");
}
}
return ;
}

AC日记——「SCOI2015」情报传递 LiBreOJ 2011的更多相关文章

  1. AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

    #2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...

  2. AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006

    「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...

  3. AC日记——「HNOI2017」礼物 LiBreOJ 2020

    #2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...

  4. AC日记——「SCOI2016」美味 LiBreOJ 2016

    #2016. 「SCOI2016」美味 思路: 主席树: 代码: #include <bits/stdc++.h> using namespace std; #define maxa 26 ...

  5. 「SCOI2015」情报传递

    「SCOI2015」情报传递 题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有 \(n\) 名情报员.每名情报员可能有若干名(可能没有)下线,除 \(1\) 名大头目外其余 ...

  6. AC日记——「HNOI2017」单旋 LiBreOJ 2018

    #2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  7. AC日记——「SCOI2016」幸运数字 LiBreOJ 2013

    「SCOI2016」幸运数字 思路: 线性基: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20005 # ...

  8. AC日记——「SCOI2016」背单词 LiBreOJ 2012

    #2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  9. AC日记——「SDOI2017」序列计数 LibreOJ 2002

    「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...

随机推荐

  1. SDUT 3930 线段树

    皮卡丘的梦想2 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一天,一只住在 501 实验 ...

  2. HDU1914 稳定婚姻匹配

    The Stable Marriage Problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (J ...

  3. js ejs for语句的第二种遍历用法

    var A = {a:1,b:2,c:3,d:"hello world"}; for(var k in A) { console.log(k,A[k]); var h = new ...

  4. ListView - SimpleAdapter 行间颜色交替(转)

    一.概述 通过扩展SimpleAdapter,来改变显示外观.因为要每行的显示颜色,首先要获得每行的View实例,然后调用setBackgroundColor函数设置. 二.实例 [效果] [代码片段 ...

  5. django中处理表单的经典流程

    def form_process_view(request): if request.method == 'POST': # 请求为 POST,利用用户提交的数据构造一个绑定了数据的表单 form = ...

  6. 关于反序列化时抛出java.io.EOFException异常

    https://www.cnblogs.com/ouhaitao/p/7683568.html https://blog.csdn.net/mym43210/article/details/40081 ...

  7. Hibernate数据连接不能正常释放的原因,以及在监听中获取apolicationContext上下文

    Hibernate数据库连接不能正常释放: https://blog.csdn.net/u011644423/article/details/44267301 监听中获取applicationCont ...

  8. SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)(山东数漫江湖)

    使用 SSM ( Spring . SpringMVC 和 Mybatis )已经很久了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录 ...

  9. 大聊Python----生产消费者模型

    在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式? 在线程世界里,生产者就是生产数 ...

  10. socket 编程 TCP 实现简单聊天功能【转】

    转自:http://blog.csdn.net/liujia2100/article/details/9006479 版权声明:本文为博主原创文章,未经博主允许不得转载. 各个主要函数的功能: .so ...