首页 > 其他分享 >线段树有感

线段树有感

时间:2023-02-25 08:55:59浏览次数:33  
标签:cha return 有感 int 线段 mid ans buidtree

当前数组 a1 a2 a3.....an;

对于每个下表i,求 aj<ai  ( j<i ) 的个数,为当ai的文化素养,

 

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+9;
int e[N],a[N],lazy[N];
void buidtree(int k,int l,int r)
{
	if(l==r)
	{
		e[k]=0;
		return ;
	}
	int mid=(l+r)>>1;
	buidtree(k<<1,l,mid);
	buidtree(k<<1|1,mid+1,r);
	e[k]=e[k<<1]+e[k<<1|1];
	return ;
}
void push(int k,int l,int r,int w)
{
	if(l==r)
	{
//		cout<<l<<endl;
		e[k]++;
		return ;
	}
	int mid=(l+r)>>1;
	if(mid<w)
	{
		push(k<<1|1,mid+1,r,w);	
	}
	else 	push(k<<1,l,mid,w);
	e[k]=e[k<<1]+e[k<<1|1];
	return ;
} 
int cha(int k,int l,int r,int x,int y)
{
	if(x<=l&&y>=r)
	{
		return e[k];
	}
	int mid=(l+r)>>1;
	int ans=0;
	if(mid>=x)
	{
		ans+=cha(k<<1,l,mid,x,y);
	}
	if(y>mid)
	{
		ans+=cha(k<<1|1,mid+1,r,x,y);
	}
	return ans;
}
//void pushdown(int k)
//{
//	e[k<<1]
//}
struct node
{
	int x,y;
}p[N];
bool cam(node x,node y)
{
	if(x.x!=y.x)
	return x.x<y.x;
	return x.y>y.y; 
}
int main()
{
	int n,d;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>d;
		p[i].x=d;
		p[i].y=i;
	}
	buidtree(1,1,n);
	sort(p+1,p+1+n,cam);
	for(int i=1;i<=n;i++)
	{
		int x=p[i].y;
		int y=p[i].x;
//		cout<<y<<" "<<x<<endl;
		y=cha(1,1,n,1,x);
		push(1,1,n,x);
//		cout<<y<<endl;
		a[x]=y;
	}
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

标签:cha,return,有感,int,线段,mid,ans,buidtree
From: https://www.cnblogs.com/xxj112/p/17153735.html

相关文章

  • 【YBT2023寒假Day14 C】字符串题(SAM)(树链剖分)(线段树)
    字符串题题目链接:YBT2023寒假Day14C题目大意对于一个字符串S定义F(S)是fail树上除了0点其它点的深度和。G(S)是S每个子串S'的F(S')之和。然后一个空......
  • Paint the Middle (提取信息转化为熟悉问题->线段覆盖问题)
     通过题目信息来进行转化成熟悉的问题首先提取出性质a......a里面的数都可以改,然后选择最远的2个aa是最优的于是就有很多区间,可能交互,就贪心让更少的区......
  • 线段树
    还是区间求和问题线段树时间复杂度建树查询区间更新区间参开资料还是区间求和问题对于单点修改,区间求和问题,我们可以用树状数组很好地解决。但是如果需要对区......
  • 线段树学习
    参考资料:《算法竞赛入门到进阶》、左神算法课线段树示意图,图片摘自《算法竞赛入门到进阶》解决区间更新、区间查询、区间累加问题基于原数组的4倍数组长度建立sum......
  • 【YBT2023寒假Day12 B】仰望星空(DP)(线段树)(笛卡尔树)
    仰望星空题目链接:YBT2023寒假Day12B题目大意有一个n*n的网格,第i列下面的ai个点都是障碍。然后又一些不是障碍的地方有特殊点,删掉它有费用。要你用最小费用使得......
  • leetcode 307. 区域和检索 - 数组可修改 前缀和 | 线段树
    前缀和查询是O(1)更新是O(n)classNumArray{public:vector<int>sum;vector<int>nums;NumArray(vector<int>&nums){this->nums=nums;sum......
  • H - 线段树 1【GDUT_22级寒假训练专题五】
    H-线段树1原题链接题意区间修改区间查询线段树简介线段树是一颗二叉树,他能通过树的分支将一块区间划分为数个单元区间,每个单元区间对应线段树中的一个叶结点。如......
  • 【ZJOI2019】线段树
    【ZJOI2019】线段树Description九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜欢的就是线段树。线段树的核心是懒标记,下面是一个带懒标记的线段树的伪......
  • hihoCoder 1078 : 线段树的区间修改
    #1078:线段树的区间修改10000ms1000ms256MB描述对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho:假设货架上......
  • 线段树板子C++
    structnode{intl,r,sum,lazy;node*lson,*rson;node(){l=r=sum=lazy=0;lson=rson......