首页 > 其他分享 >P10589 楼兰图腾(树状数组)

P10589 楼兰图腾(树状数组)

时间:2024-09-29 14:00:48浏览次数:8  
标签:typedef zheng 楼兰 树状 int P10589 long vector fan

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
const int N = 200010;
template <class T>
struct BIT
{
	T c[N];
	int sz;
	void init(int s)
	{
		sz = s;
		for(int i=1;i<=sz;++i) c[i] = 0;
	}
	T lowbit(int x)
	{
		return x&-x;
	}
	T sum(int x) 
	{
		assert(x <= sz);
		T res=0;
		while(x) res+=c[x],x-=lowbit(x);
		return res;
	}
    T query(int L, int R)
    {
        return sum(R) - sum(L-1);
    }
	void update(int x,int y) 
	{
		assert(x != 0);
		while(x<=sz) c[x]+=y,x+=lowbit(x);
	}
};
//正向反向各扫一遍
BIT<int> zheng,fan;
int zheng_up[N],zheng_down[N],fan_up[N],fan_down[N];
void solve()
{
    ll res_up = 0, res_down = 0;
    int n;
    cin>>n;
    zheng.init(n);fan.init(n);
    vector<int> a(n+1);
    for(int i=1;i<=n;++i) cin>>a[i];
    
    for(int i=1;i<=n;++i)
    {
        zheng.update(a[i],1);
        zheng_up[i] = zheng.query(a[i]+1,n);
        zheng_down[i] = zheng.query(1,a[i]-1);
    }
    for(int i=n;i;--i)
    {
        fan.update(a[i],1);
        fan_up[i] = fan.query(a[i]+1,n);
        fan_down[i] = fan.query(1,a[i]-1);
    }
    for(int i=2;i<n;++i)
    {
        res_up += (ll)zheng_up[i]*fan_up[i];
        res_down += (ll)zheng_down[i]*fan_down[i];
    }
    cout<<res_up<<' '<<res_down<<'\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:typedef,zheng,楼兰,树状,int,P10589,long,vector,fan
From: https://www.cnblogs.com/ruoye123456/p/18439596

相关文章

  • 逆序对——树状数组
    逆序对题目描述猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中\(a_i>a_j\)且\(i<j\)......
  • 树状数组(Binary Indexed Tree, BIT)
    树状数组(BinaryIndexedTree,BIT)树状数组(BinaryIndexedTree,BIT),也称为FenwickTree,是一种用于高效处理数组前缀和查询和单点更新的数据结构。它能够在(O(\logn))时间内完成单点更新和前缀和查询操作。基本概念前缀和:给定一个数组a,前缀和prefix_sum[i]表示a[0]+......
  • 二维树状数组
    单点增加,范围查询inttree[MAXN][MAXM];intnums[MAXN][MAXM];intn,m;intlowbit(inti){returni&-i;}voidadd(intx,inty,intv){for(inti=x;i<=n;i+=lowbit(i)){for(intj=y;j<=m;j+=lowbit(j)){......
  • 抛开线性回归模型,基于树模型来尝试构建回归模型,可视化绘制树状层级结构
    一提到回归,可能很多人第一时间脑海里想到的就是线性回归模型,的确,线性回归器可以说是非常常用的模型了。线性回归模型广泛应用于各种领域,如经济学、金融学、社会科学、工程学等。它可以用于预测、因果分析、趋势分析等。线性回归模型是一种广泛应用于统计学和机器学习中的预测模......
  • 树状数组浅谈
    什么是树状数组树状数组是一种码量小,常数小,支持单点修改和区间查询的数据结构。树状数组维护的信息和运算需要满足结合律并且可差分注意gcd和max操作虽然满足结合律,但不可差分,因此不能使用树状数组维护其实,树状数组能做的,线段树都能做,线段树能做的,树状数组不一定能做,但线段树......
  • 超级树状数组
    众所周知:线段树的代码长,常数大;树状数组的代码短,常数小,甚至可以通过\(10^6\)量级的数据。所以,能不能实现一个可以区间修改、区间查询的树状数组呢?由于涉及区间操作,考虑差分数组\(\{d_n\}\)。区间修改对于原数组\([l,r]\)区间每个数加\(w\)。可以转化为两次单点修改......
  • 超级树状数组
    众所周知:线段树的代码长,常数大;树状数组的代码短,常数小,甚至可以通过10610^6......
  • 树状数组求区间最大小值
    constintN=5e5+5;constintINF=0x3f3f3f3f;intn,q;inta[N],trmx[N],trmn[N];//将原来的累加改为求最值voidadd(intx,intk){while(x<=n){trmx[x]=max(trmx[x],k);trmn[x]=min(trmn[x],k);x+=lowbit(x);}}//区间查询最大/小值......
  • 【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree
    前言树状数组,即树形存储的数组,又称BinaryIndexedTree或FenwickTree。抛开它树形的存储结构,这种神奇的数据结构的应用看起来与「树」没什么关系:有一个序列\(A=(A_1,A_2,\dots,A_N)\),在不超过\(\mathcalO(\logN)\)的时间复杂度内完成下列操作:\(\to~\)求\([L,R]\)区间内所......
  • 【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树
    0.前言好久没更算法笔记专栏了,正好学了新算法来更新……这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢!1.关于RMQ问题RMQ的全称是RangeMinimum/MaximumQuery,即区间最大/最小值问题。本文中,我们的算法以求最大值为例(最小值基本......