[BZOJ4876][ZJOI2017]线段树
没有用到任何算法,代码只有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]线段树的更多相关文章
- ZJOI2017线段树
ZJOI2017线段树 题意: 给你一颗广义线段树,太长了,自己去看. 题解: 直接上zkw那一套,把闭区间换成开区间,就是把取\([l,r]\),变成取\([l-1,l-1],[r+1,r+ ...
- 「ZJOI2017」树状数组(二维线段树)
「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...
- [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)
4785: [Zjoi2017]树状数组 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 297 Solved: 195[Submit][Status ...
- 【BZOJ4785】[Zjoi2017]树状数组 树套树(二维线段树)
[BZOJ4785][Zjoi2017]树状数组 Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一 ...
- Loj #2570. 「ZJOI2017」线段树
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...
- bzoj4785:[ZJOI2017]树状数组:二维线段树
分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...
- 【UOJ295】【ZJOI2017】线段树 倍增
题目大意 http://uoj.ac/problem/295 题解 考虑像 zkw 线段树一样,从 \([l-1,l-1],[r+1,r+1]\) 这两个区间开始往上跳,直到两个指针碰到一起为止. 先 ...
- BZOJ4785 ZJOI2017树状数组(概率+二维线段树)
可以发现这个写挂的树状数组求的是后缀和.find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和.也就是说,若结果正确,则a[l-1]=a[r](mo ...
- BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...
随机推荐
- js写弹窗
1.先来看弹窗的模样 点击“弹出窗口”后会弹出下面窗口 2.下面是实现弹出窗口的代码,其中引入的jquery一般自己有,没有的话可以从网上下载.tanchuang.js和tanchuang.css写在 ...
- Perl6多线程4: Promise allof / anyof
allof : 所有代码块执行完成后才退出 anyof :只要有一个代码块执行完后就马上退出 要配合 await 一起用: my $p = start {say 'a'}; ;say 'b';} ...
- FPGA与CPLD的概念及其区别
一.FPGA与CPLD的基本概念 1.CPLD CPLD主要是由可编程逻辑宏单元(LMC,Logic Macro Cell)围绕中心的可编程互连矩阵单元组成,其中LMC逻辑结构较复杂,并具有复杂的I/ ...
- 细说show slave status参数详解(最全)【转】
在搭建好mysql主从之后,我们一般在从库上通过命令 show slave status\G 来查看主从的状态,会有很多的参数,接下来笔者就带大家好好的了解这些参数 root@localhost (n ...
- 003iptables 命令介绍
http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html iptables 防火墙可以用于创建过滤(filter)与NAT ...
- rpmdb: Thread/process 9180/139855524558592 failed: Thread died in Berkeley DB library
使用yum安装出现问题:rpmdb: Thread/process 9180/139855524558592 failed: Thread died in Berkeley DB library 解决 ...
- Codeforces 798D - Mike and distribution(二维贪心、(玄学)随机排列)
题目链接:http://codeforces.com/problemset/problem/798/D 题目大意:从长度为n的序列A和序列B中分别选出k个下表相同的数要求,设这两个序列中k个数和分别为 ...
- hive学习(六) 参数和动态分区
1.hive 参数.变量 1.1hive的命名空间: hive当中的参数.变量,都是以命名空间开头
- gm(GraphicsMagick)图片中文水印乱码问题
1.GraphicsMagick图片中文水印乱码问题处理方式 如出现乱码是由于服务器中缺少中文字库所致,为避免系统中存在多个中文字库冲突, 所以没有必要在安装GraphicsMagick时就将字库文件 ...
- IEEEXtreme 10.0 - Full Adder
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...