码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组

时间:2020-12-09 12:01:36      阅读:14      评论:0      收藏:0      [点我收藏+]

标签:std   ring   max   else   using   string   树状   数组   name   

树状数组

lowbit : 求最低位的 \(1\) 以及后面的 \(0\) 所组成的十进制数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;

const ll maxn=5e5+10;
ll n,m;

struct node
{
	ll tree[maxn];
	
	ll lowbit(const ll x)
	{
		return x & -x;
	}
	void upd(ll p,ll w)
	{
		do tree[p]+=w;
		while((p+=lowbit(p))<=n);
	}
	ll qry(ll p)
	{
		ll ret=0;
		
		do ret+=tree[p];
		while((p-=lowbit(p))!=0);
		
		return ret;
	}
}bit;

int main(void)
{
	scanf("%lld%lld",&n,&m);
	
	ll w,x,o;
	
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&x);
		bit.upd(i,x);
	}
	
	for(int i=1;i<=m;i++)
	{
		scanf("%lld",&o);
		
		if(o==1)
		{
			scanf("%lld%lld",&w,&x);
			bit.upd(w,x);
		}
		else
		{
			scanf("%lld%lld",&w,&x);
			printf("%lld\n",bit.qry(x)-bit.qry(w-1));
		}
	}
	
	return 0;
}

求逆序对:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;

const ll maxn=5e5+10;
ll n,m,sum;
ll a[maxn],b[maxn],c[maxn];

inline ll lowbit(ll x)
{
	return x & (-x);
}
inline void upd(ll x,ll w)
{
	for( ;x<=n;x+=lowbit(x)) c[x]+=w;
}
inline ll qry(ll x)
{
	ll ret=0;
	for( ;x;x-=lowbit(x)) ret+=c[x];
	return ret;
}
inline void init_hash()
{
	scanf("%lld",&n);
	
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	memcpy(b+1,a+1,n*sizeof(ll));
	sort(b+1,b+n+1);
	ll *bg=b+1;
	ll *ed=unique(b+1,b+n+1);
	for(int i=1;i<=n;i++)
	{
		a[i]=lower_bound(bg,ed,a[i])-b;
	}
}
inline void solve()
{
	for(int i=1;i<=n;i++) upd(i,1);
	for(int i=1;i<=n;i++)
	{
		sum+=qry(a[i]-1);
		upd(a[i],-1);
	}
	printf("%lld\n",sum);
}

int main(void)
{
	init_hash();
	solve();
	return 0;
}

树状数组

标签:std   ring   max   else   using   string   树状   数组   name   

原文地址:https://www.cnblogs.com/jd1412/p/14087315.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!