[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 ...
随机推荐
- HDU 2082 找单词 (普通母函数)
题目链接 Problem Description 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于 ...
- JS设计模式——2.初识接口
什么是接口 接口提供了一种用以说明一个对象应该具有哪些方法的手段. 接口之利 1.接口具有自我描述性从而促进代码的重用 2.接口有助于稳定不同中的类之间的通信方式 3.测试和调试也变得更轻松 接口之弊 ...
- Mac 下安装 ruby 环境解决 brew 安装 yarn 问题
在brew安装yarn提示 ruby的版本过低.在网上搜了一下发现 1. mac下自带的ruby 在 system 目录下 2. 其实可以用brew安装一个ruby brew install ruby ...
- perl6 一个猜测密码的注入
use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; my $r = HTTP::Request.new; my $c = HTTP::Cookies. ...
- PHP中的 get_magic_quotes_runtime
get_magic_quotes_runtime() 获得外部文件及数据库资料时是否进行转义 set_magic_quotes_runtime(1); 临时设置获得外部文件及数据库资料时是否进行转义 ...
- CTF线下赛AWD套路小结
近打了2场CTF线下赛,把AWD模式中的一些小套路做一些总结,本人web狗,二进制部分就不班门弄斧了. 一. AWD模式简介 AWD:Attack With Defence,比赛中每个队伍维护多台服务 ...
- python OS 模块 文件目录操作
Python OS 模块 文件目录操作 os模块中包含了一系列文件操作的函数,这里介绍的是一些在Linux平台上应用的文件操作函数.由于Linux是C写的,低层的libc库和系统调用的接口都是C AP ...
- WebClient vs HttpClient vs HttpWebRequest
转载:http://www.diogonunes.com/blog/webclient-vs-httpclient-vs-httpwebrequest/ Just when I was startin ...
- No manual entry for pthread_mutex_init .
$manpthread_mutex_init No manual entryfor pthread_mutex_init 解决方案: $sudo apt-get install manpages-po ...
- go语言入门(三)
条件语句 go语言的条件语句结构如下: go语言的条件语句和其他语言类似.简单列举下: 1.if 语句,布尔表达式不需要括号 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 2 ...