没有用到任何算法,代码只有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. 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  2. MySQL sleep过多解决方法

    睡眠连接过多,会对mysql服务器造成什么影响? 严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃. 造成睡眠连接过多的原因? 1. 使用了太多持久连接(个人觉得,在高并 ...

  3. eWebEditor复制粘贴图片时过滤域名

    1.找到form.js 路径:plugins/frame/scripts/form.js 这个方法: 2.替换这个方法 /** * 处理参数 */ Form.prototype.processReqP ...

  4. CentOS7.4 安装 oracle12c

    安装依赖 yum install -y binutils.x86_64 compat-libcap1.x86_64 gcc.x86_64 gcc-c++.x86_64 glibc.i686 glibc ...

  5. django入门--django-blog-zinnia搭建个人博客

    1.安装python 选择合适python2.7及以上版本安装https://www.python.org/downloads/ 2.建立虚拟环境 这不是必须的,但是建议使用,为每个项目单独引入依赖, ...

  6. Linux打补丁的一个简单例子

        前言 在做开发的过程中难免需要给内核及下载的一些源码打补丁或者说是升级,所以我们学习在Linux下使用diff制作补丁以及如何使用patch打补丁显得尤为重要. diff与patch命令介绍 ...

  7. 2.rabbitmq 工作队列

    1. 生产者 #coding:utf8 import pika import json import sys message = ''.join(sys.argv[1:]) or "hell ...

  8. Python股票信息抓取(三)

    最近在看mongodb,然后会用了一些最简单的mongodb的操作,然后想着结合股票信息的数据的抓取,然后将数据存储在mongodb中,对于mongo和数据库的最大的区别是,mongo不需要建表,直接 ...

  9. EasyUi – 6.easyui常见问题

    1.进度条 2.JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法 3. 三张表的连接查询现在到datagrid里 4.日期组合框DateBox设置readonly ...

  10. 设置或者获取CheckboxList控件的选中值

    1.设置CheckBoxList选中的值 /// <summary> /// 设置CheckBoxList中哪些是选中了的 /// </summary> /// <par ...