题目求[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. [shell] Bash编程总结

    由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试.打包.安装包等.虽然相比C++编程,要简单.傻瓜,但其在类Unix系统中可以大大提高工作的效率.所以在此对脚本编程过程中一些注意事项进 ...

  2. codeforces 463A Caisa and Sugar 解题报告

    题目链接:http://codeforces.com/problemset/problem/463/A 题目意思:某个人有 s dollar的钱,有 n 种类型的糖果,第 i 种糖果的价值为 xi d ...

  3. codeforces B. Eugeny and Play List 解题报告

    题目链接:http://codeforces.com/problemset/problem/302/B 题目意思:给出两个整数n和m,接下来n行给出n首歌分别的奏唱时间和听的次数,紧跟着给出m个时刻, ...

  4. html5--3.19 新增的progress/meter元素

    html5--3.19 新增的progress/meter元素 学习要点 了解progress/meter元素的用法 progress元素 是HTML5中新增的元素,用来建立一个进度条 通常与Java ...

  5. CISCO-更新路由器IOS

    1,查看flash,复制IOS文件名,再上传IOS 2,传送完毕查看下flash Router# show flash: 查看flash中的信息 Directory of flash: 1 -rw- ...

  6. bootstrap 学习笔记(1)---介绍bootstrap和栅格系统

    学习前端许久,对于布置框架和响应浏览器用html 和javascript 写的有点繁琐,无意间看到这个框架,觉得挺好用的就开始学习了,但是这个框架上面有很多知识,不是所有的都要学的,故将学习笔记和觉得 ...

  7. js 父组件向子组件传参

    有一个父组件页面如上,点击新增或者修改都会弹出同一个子组件如下: 父组件传参到子组件有两种方式: 一.直接把对象当成参数传给子组件,(看上去更简单,经测试发现一个问题,因为新增时要置空对象的所有信息, ...

  8. java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue

    Java中阻塞队列接口BlockingQueue继承自Queue接口,并提供put.take阻塞方法.两个主要的阻塞类实现是ArrayBlockingQueue和LinkedBlockingQueue ...

  9. 使用基于Caffe的MobileNet分类踩坑备忘录

    首先要帮Caffe甩个锅:Caffe对图像处理进行了很高明的封装,以protobuffer形式组织的搭积木式的网络构建也很灵活方便,这里的坑都是自己腿不好,走路不稳崴进去的. 1. Caffe的一个i ...

  10. UnicodeEncodeError: 'ascii' codec can't encode character u'\u65e0' in position 1: ordinal not in range(128)

    UnicodeEncodeError: 'ascii' codec can't encode character u'\u65e0' in position 1: ordinal not in ran ...