ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构 笛卡尔树+树状数组 CF1117G题解

2022-01-10 16:34:35  阅读:127  来源: 互联网

标签:树状 int 题解 top CF1117G 笛卡尔 stk -- id


题意:区间建笛卡尔树,求每个节点的siz之和。

首先看到笛卡尔树,就应该想到,因为这是一个排列,可以找到通过左边和右边第一个比自己大的元素来“建立”笛卡尔树。

设 \(l(u)\) 为下标是 \(u\) 的元素左边第一个比自身大的元素,\(r(u)\) 同理。

答案就是

\[\sum_{i=L}^R \min(r(i)-1,R)-\max(l(i)+1,L)+1 \]

将两部分拆开计算,本质是一样的。下面以右端为例

对于一个 \(\sum\),答案由两部分组成:

  1. \(r(i)\)
  2. \(R\)

我们只需要对其分别求和就好了

我们从 \(n\) 扫到 \(1\),对于一个 \(r(i)\) 会在扫到 \(r(i)\) 时变成 \(R\),且只会变一次。

用两颗树状数组和即可。复杂度 \(O(n\log n)\)

code:

#include<cstdio>
#include<vector>
const int M=1e6+6;
int n,m,a[M],l[M],r[M],L[M],R[M],num[M];long long BIT[M],ans[M];
std::vector<int>qL[M],qR[M],idL[M],idR[M];
int top,stk[M];
inline void Add1(int x,int val){
	for(;x<=n;x+=1<<__builtin_ctz(x))BIT[x]+=val;
}
inline void Add2(int x,int val){
	for(;x<=n;x+=1<<__builtin_ctz(x))num[x]+=val;
}
inline long long Query1(int x){
	long long ans=0;
	for(;x>=1;x-=1<<__builtin_ctz(x))ans+=BIT[x];
	return ans;
}
inline int Query2(int x){
	int ans=0;
	for(;x>=1;x-=1<<__builtin_ctz(x))ans+=num[x];
	return ans;
}
signed main(){
	register int i,x;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)scanf("%d",a+i);
	for(i=1;i<=n;++i){
		while(top&&a[i]>=a[stk[top]])--top;
		idL[(L[i]=top?stk[top]:0)+1].push_back(i);stk[++top]=i;
	}
	top=0;
	for(i=n;i>=1;--i){
		while(top&&a[i]>=a[stk[top]])--top;
		idR[(R[i]=top?stk[top]:n+1)-1].push_back(i);stk[++top]=i;
	}
	for(i=1;i<=m;++i)scanf("%d",l+i),qL[l[i]].push_back(i);
	for(i=1;i<=m;++i)scanf("%d",r+i),qR[r[i]].push_back(i);
	for(i=1;i<=n;++i)Add1(i,R[i]-1);
	for(i=n;i>=1;--i){
		for(int&id:idR[i])Add1(id,-R[id]+1),Add2(id,1);
		for(int&id:qR[i]){
			ans[id]+=(Query1(r[id])-Query1(l[id]-1))+1ll*i*(Query2(r[id])-Query2(l[id]-1));
		}
	}
	for(i=1;i<=n;++i)BIT[i]=num[i]=0;
	for(i=1;i<=n;++i)Add1(i,L[i]+1);
	for(i=1;i<=n;++i){
		for(int&id:idL[i])Add1(id,-L[id]-1),Add2(id,1);
		for(int&id:qL[i]){
			ans[id]-=(Query1(r[id])-Query1(l[id]-1))+1ll*i*(Query2(r[id])-Query2(l[id]-1));
		}
	}
	for(i=1;i<=m;++i)printf("%lld ",ans[i]+r[i]-l[i]+1);
}

标签:树状,int,题解,top,CF1117G,笛卡尔,stk,--,id
来源: https://www.cnblogs.com/lmpp/p/15784984.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有