本来是打算作为树剖练习的最后一题的,结果一直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. JavaScript—暂告,小节

    Javastript 的学习告一段落了.虽然还有更多的:爬虫 什么的    但是和我在学校的相比 要扎实许多.知道了兼容性 面向对象,闭包.....一些细节的用法. 虽然以后可能很少用到.可是我觉得 ...

  2. JavaScript学习总结(七)

    这一讲我们来学习DOM编程(十分重要),有了DOM编程,我们就可以操作任意的HTML元素了. DOM,文档对象模型 一个html页面被浏览器加载的时候,浏览器就会对整个html页面上的所有标签都会创建 ...

  3. eclipse环境配置,字体大小,代码智能提示,JSP页面默认字符集修改

    安装好JDK后,下载Java EE解压版eclipse 1.字体大小 Windows——>Preferences——>General——>Appearance——>Colors ...

  4. Python笔记_第四篇_高阶编程_魔法(术)方法详解(重载的再详解)

    1. 魔法方法是什么? 魔法方法(Magic Method)是Python比较独特的应用,它可以给你的类增加特殊的方法,如果你的对象实现了(重载),这些方法中的某一个,就会被Python所调用.正如装 ...

  5. SQL的技巧

    衍生特征时, 统计每个类目id的用户的购买次数.金额, 用了下面语法, 发现效率很低. select UID , sum(if(item_level1_id='1', order_cnt, 0)) s ...

  6. 69)stack和queue操作

    操作和vector类似  直接看 vector就行了 或者看笔记  C++进阶课程讲义

  7. Gym102361E Escape

    Link 首先我们可以推出一些有用的结论: 1.任意两个机器人之间的路线不能重合,但是可以垂直交叉. 2.如果一个格子没有转向器,那么最多允许两个机器人以相互垂直的方向通过. 3.如果一个格子有转向器 ...

  8. 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作

    spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...

  9. C++概要简介

    从C到C++ 新类型 bool类型 新的输入输出方式 con cout 新的内存存储方式 new delete 引用& 用于传参 函数 内敛函数inline 通过代码区膨胀 减少函数的跳转时间 ...

  10. ZJNU 2136 - 会长的正方形

    对于n*m网格 取min(n,m)作为最大的正方形边长 则答案可以表示成 s=1~min(n,m) 对于一个s*s的正方形 用oblq数组储存有多少四个角都在这个正方形边上的正方形 以4*4为例 除了 ...