http://acm.hdu.edu.cn/showproblem.php?pid=2688&&树状数组求正序数

本文介绍了一种使用树状数组实现区间更新和查询的高效算法,特别适用于需要频繁进行区间更新和查询的场景。详细解释了树状数组的基本原理、如何实现插入和查询操作,以及在实际应用中的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #define N 10001 #define M 3000001 using namespace std; int kp[M]; int s[N]; int n; int lowbit(int x) {return x&(-x);} void update(int x) { while(x<N) { s[x]++; x+=lowbit(x); } } int Quary(int x) { int sum=0; while(x>0) { sum+=s[x]; x-=lowbit(x); } return sum; } int main() { while(~scanf("%d",&n)) { int m; memset(s,0,sizeof(s)); memset(kp,0,sizeof(kp)); long long res=0; for(int i=0;i<n;++i) { scanf("%d",&kp[i]); update(kp[i]);//插入kp[i]; res+=Quary(kp[i]-1);//统计共有多少个比kp[i]小的元素 } scanf("%d",&m); char ch[3]; for(int i=0;i!=m;++i) { scanf("%s",ch); if(ch[0]=='Q') printf("%I64d\n",res); else { int a,b; scanf("%d%d",&a,&b); int k=kp[a]; for(int j=a;j<b;++j) { kp[j]=kp[j+1]; if(kp[j]<k) res++; else if(kp[j]>k) res--; } kp[b]=k; } } }return 0; } //树状数组求正序数:找当i<j时严格有a[i]<a[j]共有多少对 //其中题中给了两种操作当输入的ch为Q时查寻当前有多少对,当输入的ch为R时,输入a,b,从a开始到b一次前移一个位置而a移到b位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值