题目求[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. Python序列——字符串

    字符串 1 string模块预定义字符串 2 普通字符串与Unicode字符串 3 只适用于字符串的操作 4 原始字符串 5 Unicode字符串操作符 内建函数 1 标准类型函数与序列操作函数 2 ...

  2. UVA11551 Experienced Endeavour —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/UVA-11551 题意: 给定一列数,每个数对应一个变换,变换为原先数列一些位置相加起来的和,问r次变换后的序列是多少 题解: 构造矩 ...

  3. fiddler_test

    fiddler学习第二天 啦啦啦 拉拉呀

  4. swoole异步redis安装前置条件和流程

    ---恢复内容开始--- 1.redis服务 确认redis在服务器中已经安装了 2.hiredis库 第二步安装hiredis 下载位置 2.1获取 安装包https://github.com/re ...

  5. Android Dalvik虚拟机

    虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的. 可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik V ...

  6. javascript之创建对象的方式

    1.object构造函数创建 var obj=new Object(); obj.name='xue'; 2.对象字面量创建 var obj={ name:'xue' } 3.构造函数创建 funct ...

  7. CopyOnWrite 策略

    CopyOnWrite 是用于解决并发读写的一种策略,在Write的时候对共享变量进行Copy,在副本上进行更新,再把更新好的副本原子性地替换原来的共享变量.写入时复制是一种优化策略,多个调用者同时访 ...

  8. 使用Axis2创建Web Service

    Axis2是新一代Web Service开发工具,目前最新版本是1.5.本文主要介绍如何用Axis2创建Web Service. 首先下载二进制包和war包,将war包复制到Tomcat的webapp ...

  9. JavaScript-Tool-富文本:Simditor

    ylbtech-JavaScript-Tool-富文本:Simditor 1.返回顶部 1. 2. 2.返回顶部 1. Simditor 是团队协作工具 Tower 使用的富文本编辑器. 相比传统的编 ...

  10. 【旧文章搬运】KeUserModeCallback用法详解

    原文发表于百度空间及看雪论坛,2010-01-10 看雪论坛地址:https://bbs.pediy.com/thread-104918.htm  代码及附件可到这里下载=============== ...