题目

线段树是一种经典的数据结构,一颗[1,n]的线段树他的根是[1,n],当一个线段树的结点是[l,r]时,设mid=(l+r)>>1,则这个结点的左儿子右儿子分别是[l,mid],[mid+1,r]

当我们在线段树上跑[x,y]询问时,一般是从根节点开始计算的,设现在所在结点是[l,r],有以下几种分支:

1.若[x,y]包含[l,r],计算结束

2.否则,若左儿子和[x,y]有交,计算左儿子,若右儿子和[x,y]有交,计算右儿子

定义询问[x,y]的费用是询问时计算了几个结点

给定Q次询问,每次给定l,r,求满足l<=x<=y<=r的(x,y)的费用之和

你需要将答案对1000000007取模

分析

现将询问[l,r]挂在l上

然后分治,

假设当前做到区间[l,r]

设ls[i]表示从[l,r]开始,往下跑线段树,跑区间[i,mid]的费用
设rs[i]表示从[l,r]开始,往下跑线段树,跑区间[mid+1,i]的费用
再设lc[i]表示从[l,r]开始,往下跑线段树,跑区间[x,y]其中i<=x<=y<=mid的总费用
再设rc[i]表示从[l,r]开始,往下跑线段树,跑区间[x,y]其中mid+1<=x<=y<=i的总费用

当有询问[l1,r1],l1在[l,mid]上,r1在[mid+1,r]上,就通过ls、rs、lc、rc就可以求出来

然后将这四个数组往上传递就可以了

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
const int maxlongint=2147483647;
const long long mo=1e9+7;
const int N=100005;
using namespace std;
#define val(x,y) (1ll*(y-x+1)*(y-x+2)/2%mo)
int la[N],ne[N],to[N],n,m,tot;
long long lc[N],rc[N],ls[N],rs[N],ans[N],sum[N];
void up(int l,int r,int mid)
{
long long s=0;
for(int i=r;i>=mid+1;i--) (s+=rs[i])%=mo;
for(int i=r;i>=mid+1;i--) (lc[i]+=val(i,r))%=mo;
for(int i=mid,pp=0,pp1=0;i>=l;i--) pp1=lc[i],(lc[i]+=lc[i+1]-pp+s+ls[i]*(r-mid)%mo+(r-mid)+(mid-i+1)+mo)%=mo,pp=pp1;
lc[l]-=ls[l]+rs[r],(lc[l]+=mo)%=mo; s=0;
for(int i=l;i<=mid;i++) (s+=ls[i])%=mo;
for(int i=l;i<=mid;i++) (rc[i]+=val(l,i))%=mo;
for(int i=mid+1,pp=0,pp1=0;i<=r;i++) pp1=rc[i],(rc[i]+=rc[i-1]-pp+s+rs[i]*(mid-l+1)%mo+(mid-l+1)+(i-mid)+mo)%=mo,pp=pp1;
rc[r]-=ls[l]+rs[r],(rc[l]+=mo)%=mo; for(int i=r;i>=mid+1;i--) (++ls[i])%=mo;
for(int i=mid;i>=l;i--) (ls[i]+=ls[mid+1])%=mo;
for(int i=l;i<=mid;i++) (++rs[i])%=mo;
for(int i=mid+1;i<=r;i++) (rs[i]+=rs[mid])%=mo;
ls[l]=rs[r]=1;
}
void dg(int l,int r,int v)
{
int mid=(l+r)>>1;
if(l==r)
{
ls[l]=rs[l]=lc[l]=rc[l]=1;
for(int i=l;i<=mid;i++)
for(int j=la[i];j;j=ne[j])
if(i==to[j]) ans[j]=v;
return;
}
dg(l,mid,v+1),dg(mid+1,r,v+1);
for(int i=l;i<=r;i++) sum[i]=0;
sum[mid]=ls[mid];for(int i=mid-1;i>=l;i--) sum[i]=sum[i+1]+ls[i];
sum[mid+1]=rs[mid+1];for(int i=mid+2;i<=r;i++) sum[i]=sum[i-1]+rs[i];
for(int i=l;i<=mid;i++)
{
for(int j=la[i];j;j=ne[j])
{
if(to[j]<=mid || to[j]>r) continue;
(ans[j]+=(val(i,to[j]))*v%mo+sum[i]*(to[j]-mid)%mo+(mid-i+1)*sum[to[j]]%mo+lc[i]+rc[to[j]])%=mo;
if(i==l && to[j]==r) (ans[j]-=ls[l]+rs[r]-mo*2)%=mo;
}
}
up(l,r,mid);
}
int main()
{
scanf("%d%d",&n,&m);
for(int x,y,i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
ne[i]=la[x],la[x]=i,to[i]=y;
}
dg(1,n,1);
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
}

【51nod1792】Jabby's segment tree的更多相关文章

  1. 【BZOJ2959】长跑(Link-Cut Tree,并查集)

    [BZOJ2959]长跑(Link-Cut Tree,并查集) 题面 BZOJ 题解 如果保证不出现环的话 妥妥的\(LCT\)傻逼题 现在可能会出现环 环有什么影响? 那就可以沿着环把所有点全部走一 ...

  2. 【BZOJ2588】Count On a Tree(主席树)

    [BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...

  3. 【BZOJ2816】【ZJOI2012】网络(Link-Cut Tree)

    [BZOJ2816][ZJOI2012]网络(Link-Cut Tree) 题面 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相 ...

  4. 【CF434E】Furukawa Nagisa's Tree 点分治

    [CF434E]Furukawa Nagisa's Tree 题意:一棵n个点的树,点有点权.定义$G(a,b)$表示:我们将树上从a走到b经过的点都拿出来,设这些点的点权分别为$z_0,z_1... ...

  5. 【CF725G】Messages on a Tree 树链剖分+线段树

    [CF725G]Messages on a Tree 题意:给你一棵n+1个节点的树,0号节点是树根,在编号为1到n的节点上各有一只跳蚤,0号节点是跳蚤国王.现在一些跳蚤要给跳蚤国王发信息.具体的信息 ...

  6. 【SPOJ】QTREE7(Link-Cut Tree)

    [SPOJ]QTREE7(Link-Cut Tree) 题面 洛谷 Vjudge 题解 和QTREE6的本质是一样的:维护同色联通块 那么,QTREE6同理,对于两种颜色分别维护一棵\(LCT\) 每 ...

  7. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  8. 【BZOJ2870】最长道路tree 点分治+树状数组

    [BZOJ2870]最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来 ...

  9. 【数据挖掘】分类之decision tree(转载)

    [数据挖掘]分类之decision tree. 1. ID3 算法 ID3 算法是一种典型的决策树(decision tree)算法,C4.5, CART都是在其基础上发展而来.决策树的叶子节点表示类 ...

随机推荐

  1. Zebra架构与大数据架构优劣对比

    zebra架构的缺点 文件存储方式的缺点 1. 一个文件如果特别大,这样会造成存储的问题.一台机器的磁盘也不可能存储特别大的文件 2. 该文件在查询.删除.修改的时候都会存在问题 3. 如果文件太多, ...

  2. 使用CompletableFuture进行异步任务编排

    1.JDK5引入了Future进行异步任务的处理,Future 的接口主要方法有以下几个: (1)boolean cancel (boolean mayInterruptIfRunning) 取消任务 ...

  3. 如何重装mysql8及初次修改密码

    首先在设置里卸载旧版的mysql 然后把你之前的安装的mysql文件夹整个删掉 然后删除注册表的MySQL信息 安装新版的MySQL 新建并配置my-default.ini文件 如下: [mysqld ...

  4. 【B2B】01-BFS

    纠正我对 01-BFS 问题的错误认识. 我一直以为对于 01-BFS,每次点 $u$ 出队时,对于 $u$ 的邻接边表中的边,只要先松弛边权为 0 的边再松弛边权为 1 的边就能保证每个点只入队一次 ...

  5. Navicat 连接数据库避免中文显示乱码问题解决

    在使用Navicat Premium连接数据库进行操作时,为避免出现中文乱码的问题解决: 1.连接SQL Server 在新建数据库时,常规 设置 排序规则 为 Chinese_PRC_CS_AS_W ...

  6. 【pytorch】学习笔记(三)-激励函数

    [pytorch]学习笔记-激励函数 学习自:莫烦python 什么是激励函数 一句话概括 Activation: 就是让神经网络可以描述非线性问题的步骤, 是神经网络变得更强大 1.激活函数是用来加 ...

  7. # 深圳杯D题爬取电视收视率排行榜

    目录 深圳杯D题爬取电视收视率排行榜 站点分析 代码实现 深圳杯D题爬取电视收视率排行榜 站点分析 http://www.tvtv.hk/archives/category/tv 每天的排行版通过静态 ...

  8. 关于mysql-5.7.13-winx64服务无法启动的解决方法

    从官网上下载免安装的5.7的mysql,但是无法启动mysql服务.原因是下载下来的mysql没有data这个文件夹,故需要在cmd下先执行mysql --initialize -insecure命令 ...

  9. 预约系统(二) MVC框架搭建

    采用VS2013,自带的MVC4来搭建 MODEL层,表对象的建立: T_Bm.cs using System; using System.Collections.Generic; using Sys ...

  10. O002、虚拟化

    参考https://www.cnblogs.com/CloudMan6/p/5233484.html   OpenStack 是云操作系统,要学习 OpenStack,首先需要掌握一些虚拟化和云计算的 ...