没有用到任何算法,代码只有60+行,但是细节多如牛毛,各种分类讨论必须全部想清楚才行。

https://www.cnblogs.com/xiejiadong/p/6811289.html

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=;
ll n,nd,tot,m,u,l,r,S,mid[N],ls[N],rs[N],sm[N][],dep[N],sd[N][],fa[N][],L[N],R[N],pos[N]; bool bel(int x,int y){ return L[x]>=L[y] && R[x]<=R[y]; }
ll lca(ll a,ll b){
if (bel(a,b)) return b;
if (bel(b,a)) return a;
ll now=a;
for (ll i=S; ~i; i--) if (fa[now][i] && !bel(b,fa[now][i])) now=fa[now][i];
return fa[now][];
} void Dfs(ll x){
if (!ls[x]) return;
sm[rs[x]][]=sm[x][]; sm[rs[x]][]=sm[x][]+;
sm[ls[x]][]=sm[x][]+; sm[ls[x]][]=sm[x][];
dep[ls[x]]=dep[rs[x]]=dep[x]+;
sd[rs[x]][]=sd[x][]; sd[rs[x]][]=sd[x][]+dep[x]+;
sd[ls[x]][]=sd[x][]+dep[x]+; sd[ls[x]][]=sd[x][];
Dfs(ls[x]); Dfs(rs[x]);
} ll dfs(ll l,ll r){
ll x=++nd; L[x]=l; R[x]=r;
for (ll i=; fa[fa[x][i]][i]; i++) fa[x][i+]=fa[fa[x][i]][i];
if (l==r) return pos[l]=x;
ll m=mid[tot++];
fa[nd+][]=x; ls[x]=dfs(l,m);
fa[nd+][]=x; rs[x]=dfs(m+,r);
return x;
} ll getl(ll l){
ll lc=lca(l,u),x=dep[lc]*(sm[l][]-sm[lc][])+(bel(l,ls[lc]) && lc!=u)+sd[lc][]-sm[lc][];
return sd[l][]+sm[l][]*dep[u]-x*;
} ll getr(ll r){
ll lc=lca(r,u),x=dep[lc]*(sm[r][]-sm[lc][])+(bel(r,rs[lc]) && lc!=u)+sd[lc][]-sm[lc][];
return sd[r][]+sm[r][]*dep[u]-x*;
} int main(){
freopen("segment.in","r",stdin);
freopen("segment.out","w",stdout);
scanf("%lld",&n);
for (ll i=; i<=n; i<<=) S++;
for (ll i=; i<n; i++) scanf("%lld",&mid[i]);
tot=; dfs(,n); Dfs();
for (scanf("%lld",&m); m--; ){
scanf("%lld%lld%lld",&u,&l,&r); l--; r++;
if (!l && r>n) { printf("%lld\n",dep[u]); continue; }
ll ans=;
if (l) ans+=getl(pos[l])-((r<=n)?getl(ls[lca(pos[l],pos[r])]):);
if (r<=n) ans+=getr(pos[r])-(l?getr(rs[lca(pos[l],pos[r])]):);
printf("%lld\n",ans);
}
return ;
}

[BZOJ4876][ZJOI2017]线段树的更多相关文章

  1. ZJOI2017线段树

    ZJOI2017线段树 题意: ​ 给你一颗广义线段树,太长了,自己去看. 题解: ​ 直接上zkw那一套,把闭区间换成开区间,就是把取\([l,r]\),变成取\([l-1,l-1],[r+1,r+ ...

  2. 「ZJOI2017」树状数组(二维线段树)

    「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...

  3. [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

    4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status ...

  4. 【BZOJ4785】[Zjoi2017]树状数组 树套树(二维线段树)

    [BZOJ4785][Zjoi2017]树状数组 Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一 ...

  5. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  6. bzoj4785:[ZJOI2017]树状数组:二维线段树

    分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...

  7. 【UOJ295】【ZJOI2017】线段树 倍增

    题目大意 http://uoj.ac/problem/295 题解 考虑像 zkw 线段树一样,从 \([l-1,l-1],[r+1,r+1]\) 这两个区间开始往上跳,直到两个指针碰到一起为止. 先 ...

  8. BZOJ4785 ZJOI2017树状数组(概率+二维线段树)

    可以发现这个写挂的树状数组求的是后缀和.find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和.也就是说,若结果正确,则a[l-1]=a[r](mo ...

  9. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

随机推荐

  1. 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结

    20155117 王震宇 2006-2007-2 <Java程序设计>第三周学习总结 教材学习内容总结 在JAVA程序编写中,常常要用到对象(Object),要产生对象首先要定义类(Cla ...

  2. 浅析 Spring Aop

    aop也是Spring里比较重要的一个点,最近把源码看了下,这里总结一下 使用上主要就下面的点注意下: 相关的Annotaion Around Before After AfterReturning ...

  3. Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)

    题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用flo ...

  4. 29、filter、map、reduce的作用?

    通俗的说..都是用在一堆数据(比如一个列表)上.. map是用同样方法把所有数据都改成别的..字面意思是映射..比如把列表的每个数都换成其平方.. reduce是用某种方法依次把所有数据丢进去最后得到 ...

  5. python 第二章 对象与类型

    可变对象和不可变对象 1,可变对象,list(列表),dict(字典),集合(set),字节数组. 2,不可变对象,数值类型,字符串,字节串,元组(具体形式 ()). 注意条件:可变和不可变指的是该对 ...

  6. python使用unittest模块selenium访问斗鱼获取直播信息

    import unittest from selenium import webdriver from bs4 import BeautifulSoup as bs class douyu(unitt ...

  7. NuGet Package Explorer上传时报:failed to process request:'Method Not Allowed'错误解决办法

    相关日志:PUT /api/v2/package - 1000 -  NuGet+Package+Explorer/3.15.0.0+(Microsoft+Windows+NT+6.2.9200.0) ...

  8. 在Linux 系统上运行多个tomcat

    --原来的不动,添加环境变量(.bash_profile)export JAVA_HOME=/home/public/jdk1.8.0_131export JRE_HOME=$JAVA_HOME/jr ...

  9. WPF之模拟打开或关闭Windows功能

    用WPF模拟打开或关闭Windows功能的实现方法其实很简单,主要用递归判断当前节点的子节点和父节点的选中状态就行了. 一.效果演示 先看看效果图: 二.部分代码 xaml代码: <TreeVi ...

  10. C语言实现int转换string

    #include <stdio.h> #include <stdlib.h> #include <string.h> int string2int(const ch ...