hdu2492树状数组
2024-09-03 10:04:44
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2492/
题目大意:给定一个序列,求长度为三的子序列(a,b,c)使得a<b<c或a>b>c,求这样的序列的个数;只要对于每一个位置的数,用树状数组维护前缀和,求出该位置前面比他大的数的个数和比他小的个数,再用另一个树状数组从末位向前维护该位置后面比他大的数的格式和比他小的数的个数。最终 前大*后小+前小*后大 对n个位置求和即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define pb(i) push_back(i)
#define ppb(x) pop_back(x)
#define inf 0x3f3f3f3f
#define maxn 100010
int n,m,t;
int a[maxn],c[maxn];
int lowbit(int x)
{
return x&(-x);
}
int query(int x)
{
int ans=;
for(int i=x;i;i-=lowbit(i))
{
ans+=c[i];
}
return ans;
}
void update(int x,int C)
{
for(int i=x;i<=;i+=lowbit(i))
{
c[i]+=C;
}
}
int l1[maxn],r1[maxn],l2[maxn],r2[maxn];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
scan(t);
while(t--)
{
scan(n);
f(i,,n)scan(a[i]);
mem(c,);
f(i,,n)
{
l1[i]=query(a[i]-);//查询左侧比a[i]小的数的个数
l2[i]=i--l1[i];//查询左侧比a[i]大的数的数量
update(a[i],);
}
mem(c,);
for(int i=n;i>=;i--)
{
r1[i]=query(a[i]-);//右侧比a[i]小的数的个数
r2[i]=n-i-r1[i];//右侧比a[i]大的数的个数
update(a[i],);
}
ll ans=;
f(i,,n)
{
ans+=l1[i]*r2[i]+l2[i]*r1[i];
}
pf("%lld\n",ans);
}
}
最新文章
- CenterOS 7 常用命令
- JavaScript Lib Interface (JavaScript系统定义的接口一览表)
- Linux下多网卡同网段多IP网络分流设定方法
- hdu 5112 A Curious Matt
- wuzhicms 自定义SQL 标签
- Log4E
- 14.4.3 Adaptive Hash Index 自适应hash index
- QT实现窗口缩放打开与关闭(重叠窗口,太有意思了)
- hdu3278Puzzle
- CDN技术详解及实现原理
- linux-ubuntu下fastQC的安装
- Angular服务的5种创建方式
- python并发编程之多进程(实现)
- Java大小写转化
- tensorflow安装-【老鱼学tensorflow】
- Cocos2dx开发之运行与渲染流程分析
- mybatis的三种批量插入以及次效率比较
- soul
- 洛谷 P2812 校园网络【[USACO]Network of Schools加强版】 解题报告
- python + lisp hy的新手注记1