题目求[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. 电脑设备对于IT人员,犹如武器对于士兵

    本人做了多年Softwarer,写些感受. 比我们早的老一代程序员更是用自己的健康总结了一些经验. 先说关于健康方面: 程序员要长期坐着,这对健康损害很大,颈椎腰椎,心肺能力都会衰减.以前只是听说,自 ...

  2. NOI2017退役记

    Day1 全世界都200+我162,考场上fread和fwrite写挂了直接删了,然后就被卡了48也是没谁了. Day2 2-SAT写挂,就没有然后了. 明明退役前一直都在做自己最想做的事情,连这就是 ...

  3. codevs 1497取余运算

    1497 取余运算  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamon   题目描述 Description 输入b,p,k的值,编程计算bp mod k的值. ...

  4. 实现虚拟机VMware上linux与windows互相复制与粘贴

    from:http://blog.csdn.net/u012243115/article/details/40454063 系统环境: win7系统,虚拟机VMwareWorkstation上运行的C ...

  5. 解决最近windows版本Node.js中npm出现的“Error: ENOENT, stat 'C:\Users\UserName\AppData\Roaming\npm”的问题

    (转载请注明出处,from www.cnblogs.com/xdxer) 问题可能如下所示 解决方案: 在 'C:\Users\UserName\AppData\Roaming\‘ 下手动的增加一个文 ...

  6. Nagios监控Windows的网卡流量

    Nagios监控Windows的网卡流量 使用/usr/local/nagios/libexec/中的check_traffic.sh,不但可以监控Linux的网卡流量,也可以监控Windows服务器 ...

  7. C# HTML解析工具HtmlAgilityPack使用实例(一)

    一.生成HTML字符串 //生成DOM字符串结构 HtmlNode container = HtmlNode.CreateNode("<div />"); HtmlNo ...

  8. C语言--递归问题

    1,一个经典的例子,理解递归过程的展开 #include<stdio.h> void func(int i){ ) func(i/); printf("%d",i) } ...

  9. Codeforces1107E Vasya and Binary String 记忆化dp

    Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...

  10. HDOJ-2160

    母猪的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...