AC日记——「SCOI2015」情报传递 LiBreOJ 2011
思路:
可持久化树状数组模板;
代码:
#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的更多相关文章
- AC日记——「SCOI2015」国旗计划 LiBreOJ 2007
#2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...
- AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006
「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...
- AC日记——「HNOI2017」礼物 LiBreOJ 2020
#2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...
- AC日记——「SCOI2016」美味 LiBreOJ 2016
#2016. 「SCOI2016」美味 思路: 主席树: 代码: #include <bits/stdc++.h> using namespace std; #define maxa 26 ...
- 「SCOI2015」情报传递
「SCOI2015」情报传递 题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有 \(n\) 名情报员.每名情报员可能有若干名(可能没有)下线,除 \(1\) 名大头目外其余 ...
- AC日记——「HNOI2017」单旋 LiBreOJ 2018
#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- AC日记——「SCOI2016」幸运数字 LiBreOJ 2013
「SCOI2016」幸运数字 思路: 线性基: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20005 # ...
- AC日记——「SCOI2016」背单词 LiBreOJ 2012
#2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
- AC日记——「SDOI2017」序列计数 LibreOJ 2002
「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...
随机推荐
- 手脱ACProtect V1.4X(有Stolen Code)之补区段
首先需要说的是,这个壳是ximo大神视频教程里的 0041F000 > pushad ; //程序入口点 0041F001 E8 call NgaMy.0041F007 0041F006 E8 ...
- WPF 与设备无关的单位
WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile PC的屏幕上和在50英寸的电视机上都 ...
- redis初试Not all 16384 slots are covered by nodes
按照这里的步骤玩redis集群,http://www.redis.cn/topics/cluster-tutorial.html ./src/redis-trib.rb create --replic ...
- C11简洁之道:初始化改进
1. C++98/03初始化 我们先来总结一下C++98/03的各种不同的初始化情况: //普通数组 ] = {, , }; //POD(plain old data) struct A { int ...
- JS之document例题讲解1(两张表之间数据转移、日期时间选择、子菜单下拉、用div做下拉菜单、事件总结)
作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...
- POJ 30253 Fence Repair (二叉树+优先队列)
题目链接 Description Farmer John wants to repair a small length of the fence around the pasture. He meas ...
- js_面向对象设计和行为委托设计模式
最近换了新工作,面试过程中有多多少少的问题没有给的出答案,为自己的技术短板而促急. javascript中万物皆对象(键:值构成的一种数据),暂且不讨论这个句话的对与错,可以想象对象在javascri ...
- javascript执行上下文学习一
原文: http://web.jobbole.com/84044/ http://blog.csdn.net/github_34514750/article/details/52901781 1.三种 ...
- hdu 3371(prim算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3371 Connect the Cities Time Limit: 2000/1000 MS (Jav ...
- Android Studio 中引入Library
启动AndroidStudio后,打开你需要接收Library的项目.比如有两个项目,项目A,和Library项目B,那么打开项目A.图中所示为项目的结构图,点击右上角的File菜单. 2 在下拉菜单 ...