树剖想法题——BZOJ3626
本来是打算作为树剖练习的最后一题的,结果一直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的更多相关文章
- 洛谷树剖模板题 P3384 | 树链剖分
原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include< ...
- A - Aragorn's Story HDU - 3966 树剖裸题
这个题目是一个比较裸的树剖题,很好写. http://acm.hdu.edu.cn/showproblem.php?pid=3966 #include <cstdio> #include ...
- 树剖裸题——BZOJ1036 树的统计
#include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #defi ...
- CF487E Tourists 【圆方树 + 树剖 + 堆】
题目链接 CF487E 题解 圆方树 + 树剖 裸题 建好圆方树维护路径上最小值即可 方点的值为其儿子的最小值,这个用堆维护 为什么只维护儿子?因为这样修改点的时候就只需要修改其父亲的堆 这样充分利用 ...
- SPOJ375Query on a tree I(树剖+线段树)(询问边)
ιYou are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- NOI2015软件包管理器 树剖线段树
题目: 一棵树,兹磁 1.查询根到一个点的染色点数并全染好 2.查询子树内染色点数并把颜色洗掉 树剖裸题,丝毫不虚(为什么我考试的时候碰不到这种好题呢)好像20min写完搞定 #include < ...
- [NOI2015,LuoguP2146]软件包管理器------树剖
***题目链接戳我*** 又是在树上瞎搞滴题目.... 我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖 分析完毕,似乎没啥好说的 ...
- bzoj4034: [HAOI2015]树上操作(树剖)
4034: [HAOI2015]树上操作 题目:传送门 题解: 树剖裸题: 麻烦一点的就只有子树修改(其实一点也不),因为子树编号连续啊,直接改段(记录编号最小和最大) 开个long long 水模版 ...
- SP375 QTREE - Query on a tree (树剖)
题目 SP375 QTREE - Query on a tree 解析 也就是个蓝题,因为比较长 树剖裸题(基本上),单点修改,链上查询. 顺便来说一下链上操作时如何将边上的操作转化为点上的操作: 可 ...
随机推荐
- 康冕峰IT技术总结博客CSDN索引
计算1-x内的质数, 结果保存在mysql中. Java 程序员面试笔试宝典 4.1基础知识https://blog.csdn.net/qq_40993412/article/details/1040 ...
- 运用Access学习数据库的三大范式
第一范式(1NF):强调的是列的原子性,即“列不能够再分成其他几列”,同一列中不能有多个值. 例子:业余爱好编码表+员工编码表 当员工杨来的业余爱好有多个时,此时的数据库设计不满足第一范式,可进行如下 ...
- 量化交易alpha、beta、shape等基本概念梳理
1.期货型基金(CTA)的 Alpha 和 Beta 是指什么? https://zhuanlan.zhihu.com/p/20700337 1980S ...
- Kerbernetes的Service资源管理
Kerbernetes的Service资源管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Service概述 1>.为什么需要Service资源 我们知道在Kube ...
- 配置Action
配置Action 实现了Action类后,就可以在struts.xml中配置该Action类了.配置Action就是让Struts2 知道哪个Action处理哪个请求,也就是完成用户请求和Action ...
- Struts 2的流程
Struts 2的流程 一.Struts 2 的开发步骤: 在web.xml中定义核心的Filter来拦截用户的请求. 由于Web应用时基于请求/响应架构的应用,所以不管哪个MVC Web框架,都需要 ...
- 吴裕雄--天生自然 PYTHON3开发学习:运算符
#!/usr/bin/python3 a = 21 b = 10 c = 0 c = a + b print ("1 - c 的值为:", c) c = a - b print ( ...
- python学习笔记-面向对象设计
前言 1.三大编程范式: 面向过程编程 函数式编程 面向对象编程 2.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起,便实现 ...
- 关于live2D的使用
<script src="https://eqcn.ajz.miesnfu.com/wp-content/plugins/wp-3d-pony/live2dw/lib/L2Dwidge ...
- SpringBoot项目示例
一.准备工作: 环境及工具:Eclipse+JDK8+Maven+SpringBoot 二.源码: 1.项目架构: 2.引入pom.xml <project ...