题目求[a,b]到c的lca深度之和   显然是一个满足区间减法的操作

于是简化为

[1,b]到c的lca深度之和

(然并卵╮(╯▽╰)╭)然后就用奇技淫巧发现

a和b的lca深度=先把根节点到a的路径都染色,然后查根节点到b的路径上染色点数

只要把染色改为权值+1,就可以轻易解决区间的问题

方法显然:离线,把询问排序,维护一棵兹磁区间加法和区间求和的线段树即可轻易解决

 #include <bits/stdc++.h>
#define mid ((l+r)>>1)
#define mod 201314
using namespace std;
int n,m,N,M,an,p,q,o;
int size[],fa[],top[],pos[],son[],bro[],l[],r[],ans[];
int sum[],flag[];
struct quer
{
int r,x,bel;
} que[];
bool operator<(quer a,quer b){ return a.r<b.r;}
void ins(int a,int b,int c)
{
que[++N].r=a;
que[N].x=b;
que[N].bel=c;
}
int build(int now)
{
size[now]=;
for(int i=son[now];i;i=bro[i])
size[now]+=build(i);
return size[now];
}
void pou(int now,int to)
{
int ma=,id=;top[now]=to;pos[now]=++M;
for(int i=son[now];i;i=bro[i])
if(size[i]>ma) ma=size[i],id=i;
if(id) pou(id,to);
for(int i=son[now];i;i=bro[i])
if(i!=id) pou(i,i);
}
void push(int now,int l,int r)
{
if(flag[now] && l!=r)
{
sum[now*]+=(mid-l+)*flag[now];
sum[now*]%=mod;
sum[now*+]+=(r-mid)*flag[now];
sum[now*]%=mod;
flag[now*]+=flag[now];
flag[now*]%=mod;
flag[now*+]+=flag[now];
flag[now*+]%=mod;
flag[now]=;
}
}
void add(int now,int l,int r,int x,int y)
{
if(l==x && r==y)
{
sum[now]+=r-l+;flag[now]+=;
sum[now]%=mod;
return;
}
push(now,l,r);
if(x<=mid) add(now*,l,mid,x,min(mid,y));
if(y>mid) add(now*+,mid+,r,max(x,mid+),y);
sum[now]=sum[now*]+sum[now*+];
}
int query(int now,int l,int r,int x,int y)
{
if(l==x && r==y)
return sum[now];
push(now,l,r);
int ans=;
if(x<=mid) ans+=query(now*,l,mid,x,min(mid,y));
if(y>mid) ans+=query(now*+,mid+,r,max(x,mid+),y);
return ans;
}
void link(int now)
{
for(;now;now=fa[top[now]])
add(,,M,pos[top[now]],pos[now]);
}
int qu(int now)
{
for(an=;now;now=fa[top[now]])
an=(an+query(,,M,pos[top[now]],pos[now]))%mod;
return an;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&fa[i]),++fa[i],
bro[i]=son[fa[i]],son[fa[i]]=i;
build();pou(,);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&p,&q,&o);
l[i]=p;r[i]=++q;++o;
if(p)ins(p,o,i);ins(q,o,i);
}
sort(que+,que+N+);
int now=;
for(int i=;i<=N;i++)
{
while(que[i].r>now) link(++now);
int ret=qu(que[i].x);
if(now==l[que[i].bel])
ans[que[i].bel]-=ret;
else
ans[que[i].bel]+=ret;
}
for(int i=;i<=m;i++)
printf("%d\n",(ans[i]+mod)%mod);
return ;
}

bzoj3626: [LNOI2014]LCA奇技淫巧+树剖+线段树的更多相关文章

  1. [LNOI2014]LCA(树剖+线段树)

    \(\%\%\% Fading\) 此题是他第一道黑题(我的第一道黑题是蒲公英) 一直不敢开,后来发现是差分一下,将询问离线,树剖+线段树维护即可 \(Code\ Below:\) #include ...

  2. 洛谷P4315 月下“毛景树”(树剖+线段树)

    传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 ...

  3. LUOGU P1967 货车运输(最大生成树+树剖+线段树)

    传送门 解题思路 货车所走的路径一定是最大生成树上的路径,所以先跑一个最大生成树,之后就是求一条路径上的最小值,用树剖+线段树,注意图可能不连通.将边权下放到点权上,但x,y路径上的lca的答案不能算 ...

  4. BZOJ_2238_Mst_树剖+线段树

    BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...

  5. BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树

    BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...

  6. BZOJ_2157_旅游_树剖+线段树

    BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...

  7. 【BZOJ5210】最大连通子块和 树剖线段树+动态DP

    [BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...

  8. [CF1007D]Ants[2-SAT+树剖+线段树优化建图]

    题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...

  9. LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)

    题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...

  10. BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)

    传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...

随机推荐

  1. iOS:UITextField中文输入法输入时对字符长度的限制

      如题的问题,又是个让我抓狂了大半天的问题,还是做个记录,有与类似问题的同学可参考,但不一定对.具体问题还需具体分析.我遇到的需求是这样的:有一个输入框,输入框内输入文字,文字字数限制在20字.   ...

  2. 提高scroll性能

    在DevTools中开始渲染,向下滑动一点点滚动条,然后停止滚动. 在结果中,注意frames总是在30ftps线上面,甚至都木有很接近69ftps线的(事实上帧执行的太缓慢以致于60ftps线在图上 ...

  3. hdu-5754 Life Winner Bo(博弈)

    题目链接: Life Winner Bo Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/ ...

  4. BZOJ_5416_[Noi2018]冒泡排序_DP+组合数+树状数组

    BZOJ_5416_[Noi2018]冒泡排序_DP+组合数+树状数组 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好题. ...

  5. [CTSC 2018] 混合果汁

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5343 [算法] 对于每组询问 , 首先二分答案 显然 , 最优策略为优先选择价格低的 ...

  6. rsync应用实例

      一. 通过ssh的方式 前面介绍的rsync 5种方式当中,第二.第三(1个冒号)就属于通过ssh的方式,这种方式其实就是让用户去登录到远程机器,然后执行rsync的任务. [root@local ...

  7. PHP mysql_fetch_array与mysql_fetch_row的区别

    如果你的表里面有字段a,b,c那么你用mysql_fetch_row() 就返回array(1=>a的值,2=>b的值,3=>c的值)这个时候你读数组的话,只能这样写$array[1 ...

  8. C/C++获取Windows系统CPU和内存及硬盘使用情况

    //1.获取Windows系统内存使用率 //windows 内存 使用率 DWORD getWin_MemUsage(){ MEMORYSTATUS ms; ::GlobalMemoryStatus ...

  9. hibernate学习二 基本用法

    一  映射文件User.hbm.xml 定义了持久化类实例是如何存储和加载的,这个文件定义了持久化类和表的映射. 根据映射文件,Hibernate可以生成足够的信息以产生所有的SQL语句,也就是类的实 ...

  10. Win 7下破解Loadrunner 11(带中文版下载地址)

    空间管理您的位置: 51Testing软件测试网 » 测试是一种生活态度 » 日志 与您一起分享在测试过程中的快乐与辛酸... Win 7下破解Loadrunner 11(带中文版下载地址) 上一篇  ...