正解:树剖+线段树

解题报告:

传送门$QwQ$

看到$dep[lca]$啥的就想到之前托腮腮$CSP$模拟$D1T3$的那个套路,,,

然后试下这个想法,于是$dep[lca(x,y)]=\sum_{i=1}^{\infty}[i\leq dep[lca(x,y)]]$,就可以是,从$x$到根全部加一然后查询$y$到根的权值和.

现在变成$\sum_{i=l}^r dep[lca(i,x)]$,那就$l$到$r$到根全加一然后查询$x$到根的权值和.

显然考虑差分呗?就$1$到$r$全加一的权值和减去$1$到$l-1$全加一的权值和.

于是就从$1$枚举到$n$每次从当前节点到根全加一,顺便维护下这个答案就完事$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lowbit(x) (x&(-x))
#define rg register
#define gc getchar()
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];~i;i=edge[i].nxt) const int N=+,mod=;
int n,q,dfn[N],sz[N],top[N],fa[N],as[N],hs[N],dfn_cnt,tr[N<<],ad[N<<];
vector<int>son[N];
struct node{int id,x,op;};
vector<node>V[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void add(ri &x,ri y){x+=y;if(x>=mod)x-=mod;if(x<)x+=mod;}
il void dfs1(ri x)
{
sz[x]=;ri siz=son[x].size();
rp(i,,siz-){dfs1(son[x][i]),sz[x]+=sz[son[x][i]];if(sz[son[x][i]]>sz[hs[x]])hs[x]=son[x][i];}
}
il void dfs2(ri x,ri tp)
{
top[x]=tp;dfn[x]=++dfn_cnt;if(hs[x])dfs2(hs[x],tp);ri siz=son[x].size();
rp(i,,siz-)if(son[x][i]^hs[x])dfs2(son[x][i],son[x][i]);
}
il void pushdown(ri x,ri l,ri r)
{
if(!ad[x])return;
ri mid=(l+r)>>;
add(tr[ls(x)],1ll*ad[x]*(mid-l+)%mod),add(tr[rs(x)],1ll*ad[x]*(r-mid)%mod);
ad[ls(x)]+=ad[x],ad[rs(x)]+=ad[x];ad[x]=;
}
void modify(ri x,ri l,ri r,ri to_l,ri to_r)
{
if(to_l<=l && r<=to_r){add(tr[x],r-l+);add(ad[x],);return;}
pushdown(x,l,r);
ri mid=(l+r)>>;if(mid>=to_l)modify(ls(x),l,mid,to_l,to_r);if(mid<to_r)modify(rs(x),mid+,r,to_l,to_r);
tr[x]=(tr[ls(x)]+tr[rs(x)])%mod;
}
int query(ri x,ri l,ri r,ri to_l,ri to_r)
{
if(to_l<=l && r<=to_r)return tr[x];
pushdown(x,l,r);ri mid=(l+r)>>,ret=;
if(mid>=to_l)ret=query(ls(x),l,mid,to_l,to_r);;if(mid<to_r)add(ret,query(rs(x),mid+,r,to_l,to_r));
return ret;
} int main()
{
freopen("4211.in","r",stdin);freopen("4211.out","w",stdout);
n=read();q=read();rp(i,,n)son[fa[i]=read()+].push_back(i);dfs1();dfs2(,);
rp(i,,q){ri l=read(),r=read()+,x=read()+;V[l].push_back((node){i,x,-});V[r].push_back((node){i,x,});}
rp(i,,n)
{
ri nw=i;while(nw)modify(,,n,dfn[top[nw]],dfn[nw]),nw=fa[top[nw]];
for(auto j:V[i])
{nw=j.x;while(nw)add(as[j.id],j.op*query(,,n,dfn[top[nw]],dfn[nw])),nw=fa[top[nw]];}
}
rp(i,,q)printf("%d\n",as[i]);
return ;
}

最新文章

  1. 【C语言入门教程】2.9 小结
  2. Yii2.0中文开发向导——控制器(Controller)
  3. android 自定义控件二之仿QQ长按删除
  4. 6款好用的Python IDE
  5. DIV焦点事件
  6. Java学习日记-2.2 增强后的switch-case
  7. bayes
  8. [转载]Android中WebView自适应屏幕
  9. 快速提高Android开发调试的使用技巧
  10. C++数据
  11. Linux中MySQL5.6编译安装与MySQL5.7二进制安装步骤
  12. nginx屏蔽某段IP、某个国家的IP
  13. Android开发学习笔记(二)——编译和运行原理(1)
  14. ul点击li,增加样式
  15. 主流蓝牙芯片盘点,Nordic/TI/博通哪家强?
  16. BZOJ 2663: [Beijing wc2012]灵魂宝石
  17. ThinkPHP 3.2 性能优化,实现高性能API开发
  18. Scala基础语言api入门学习
  19. 鸟哥的私房菜:Linux文件与目录管理
  20. cetos7 systemd 详解

热门文章

  1. ExecutorService小试牛刀
  2. Hadoop应用程序示例
  3. @codeforces - 590E@ Birthday
  4. IDEA 通过数据库生成entity实体类
  5. Eclipse(Maven) web项目更改项目名称
  6. 上传图片保存到MySql数据库并显示--经验证有效
  7. TP5单例模式操作Model
  8. Codeforces3C. Tic-tac-toe 题解 状态压缩+搜索
  9. UVA 437 &quot;The Tower of Babylon&quot; (DAG上的动态规划)
  10. 为什么Redis是单线程,性能还如此高?