本来是打算作为树剖练习的最后一题的,结果一直WA。

本来以为是自己写的太丑。

最后发现5w的数据

我开了10w的数组

然而有一个数组要×2

哦,好棒棒。

 #include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define foru(i,x,y) for(LL i=x;i<=y;i++)
using namespace std;
typedef int LL;
const LL N=2e5;
const LL mod=;
struct edge{LL to,nxt;}e[*N];
struct node{LL s,t;}t[*N];
struct que{LL id,flag,p;}a[N];
LL f[N],b[N],d[N],id[N],ans[N],siz[N],son[N],top[N],head[N],
cnt,ne,n,m,nq,q[N]; bool cmp(que a,que b){return a.p<b.p;} void add(LL a,LL b){
e[++ne]=(edge){b,head[a]};head[a]=ne;
} void dfs(LL k,LL fa,LL dep){
f[k]=fa;d[k]=dep;siz[k]=;son[k]=;
for(LL i=head[k];i;i=e[i].nxt){
LL v=e[i].to;
if(v==fa)continue;
dfs(v,k,dep+);
siz[k]+=siz[v];
if(siz[v]>siz[son[k]])son[k]=v;
}
} void build(LL k,LL tp){
id[k]=++cnt;top[k]=tp;
if(son[k])build(son[k],tp);
for(LL i=head[k];i;i=e[i].nxt){
LL v=e[i].to;
if(v!=son[k]&&v!=f[k])build(v,v);
}
} #define mid ((L+R)>>1)
#define ls (k<<1)
#define rs ls+1 void pd(LL k,LL L,LL R){
t[k].s+=t[k].t*(R-L+);
if(t[k].s>=mod)t[k].s%=mod;
t[ls].t+=t[k].t; t[rs].t+=t[k].t;
t[k].t=;
} void pu(LL k,LL L,LL R){
t[k].s=t[ls].s+t[rs].s;
if(t[k].s>=mod)t[k].s%=mod;
} void update(LL k,LL L,LL R,LL l,LL r,LL x){
pd(k,L,R);
if(r<L||l>R)return;
if(l<=L&&R<=r){t[k].t+=x;return;}
update(ls,L,mid,l,r,x); update(rs,mid+,R,l,r,x);
pd(ls,L,mid);pd(rs,mid+,R);
pu(k,L,R);
} LL qur(LL k,LL L,LL R,LL l,LL r){
pd(k,L,R);
if(l>R||r<L)return ;
if(l<=L&&R<=r)return t[k].s;
return qur(ls,L,mid,l,r)+qur(rs,mid+,R,l,r);
} LL get(LL x){
LL ret=;
while(x){
ret+=qur(,,cnt,id[top[x]],id[x]);
if(ret>=mod)ret%=mod;
x=f[top[x]];
}
return ret;
} void change(LL x){
while(x){
update(,,cnt,id[top[x]],id[x],);
x=f[top[x]];
}
}
int main(){
LL x,l,r;
scanf("%d%d",&n,&m);
foru(i,,n){
scanf("%d",&x);x++;
add(x,i);add(i,x);
}
foru(i,,m){
scanf("%d%d%d",&l,&r,&q[i]);q[i]++;
a[++nq].p=l;a[nq].id=i;a[nq].flag=-;
a[++nq].p=r+;a[nq].id=i;a[nq].flag=;
}
dfs(,,);
build(,);
sort(a+,a++nq,cmp);
LL j=;
while(!a[j+].p)j++;
foru(i,,n){
change(i);
while(a[j+].p==i)j++,ans[a[j].id]+=get(q[a[j].id])*a[j].flag;
}
foru(i,,m)printf("%d\n",(ans[i]+mod)%mod);
return ;
}

树剖想法题——BZOJ3626的更多相关文章

  1. 洛谷树剖模板题 P3384 | 树链剖分

    原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include< ...

  2. A - Aragorn's Story HDU - 3966 树剖裸题

    这个题目是一个比较裸的树剖题,很好写. http://acm.hdu.edu.cn/showproblem.php?pid=3966 #include <cstdio> #include ...

  3. 树剖裸题——BZOJ1036 树的统计

    #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #defi ...

  4. CF487E Tourists 【圆方树 + 树剖 + 堆】

    题目链接 CF487E 题解 圆方树 + 树剖 裸题 建好圆方树维护路径上最小值即可 方点的值为其儿子的最小值,这个用堆维护 为什么只维护儿子?因为这样修改点的时候就只需要修改其父亲的堆 这样充分利用 ...

  5. SPOJ375Query on a tree I(树剖+线段树)(询问边)

    ιYou are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  6. NOI2015软件包管理器 树剖线段树

    题目: 一棵树,兹磁 1.查询根到一个点的染色点数并全染好 2.查询子树内染色点数并把颜色洗掉 树剖裸题,丝毫不虚(为什么我考试的时候碰不到这种好题呢)好像20min写完搞定 #include < ...

  7. [NOI2015,LuoguP2146]软件包管理器------树剖

    ***题目链接戳我*** 又是在树上瞎搞滴题目.... 我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖 分析完毕,似乎没啥好说的 ...

  8. bzoj4034: [HAOI2015]树上操作(树剖)

    4034: [HAOI2015]树上操作 题目:传送门 题解: 树剖裸题: 麻烦一点的就只有子树修改(其实一点也不),因为子树编号连续啊,直接改段(记录编号最小和最大) 开个long long 水模版 ...

  9. SP375 QTREE - Query on a tree (树剖)

    题目 SP375 QTREE - Query on a tree 解析 也就是个蓝题,因为比较长 树剖裸题(基本上),单点修改,链上查询. 顺便来说一下链上操作时如何将边上的操作转化为点上的操作: 可 ...

随机推荐

  1. 使用Matplotlib

    1.Matplotlib是python的一个绘图库. 2.from matplotlib import pyplot as plt

  2. 安卓和iOS统一下载页面

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Linxu--导出oracle数据

    配置导出的表:(configure.sh) #!/bin/bash function get_config() { tables=( BLOG WF_PROCESS WF_TASK WF_TASK_A ...

  4. PowerDesigner 表格导出为excel(转载)

    选中tablesctrl + shift +x 然后运行脚本 '******************************************************************** ...

  5. XML技术详解

    XML 1.XML概述 XML可扩展标记语言是一种基于文本的语言用作应用程序之间的通信模式,是一个非常有用的描述结构化信息的技术.XML工具使得转化和处理数据变得十分容易,但同样也要领域相关的标准和代 ...

  6. mysql my.cnf常用的配置

    [mysqld]basedir = /usr/local/mysql/datadir = /usr/local/mysql/dataport = 3306pid-file = /usr/local/m ...

  7. LaunchPad(思维)

    链接:https://ac.nowcoder.com/acm/contest/3665/D来源:牛客网 题目描述 Hery is a boy with strong practical abiliti ...

  8. 损失函数coding

    损失函数(Loss Function)和成本函数(Cost Function)之间有什么区别? 在此强调这一点,尽管成本函数和损失函数是同义词并且可以互换使用,但它们是不同的. 损失函数用于单个训练样 ...

  9. css 传数据套路

    <input type=hidden> 那么该标签就不会显示 但是我们可以用这个标签储存数据 这是一个利用标签元素隐藏

  10. JavaScript学习笔记 - 进阶篇(5)- 事件响应

    什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...