当前位置: 首页 > article >正文

《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 D: 数列-训练套题T10T3

数列(sequence.pas/c/cpp)

 问题描述

一个简单的数列问题:给定一个长度为n的数列,求这样的三个元素ai, aj, ak的个数,满足ai < aj > ak,且i < j < k。

 输入数据

第一行是一个整数n(n <= 50000)。

第二行n个整数ai(0 <= ai <= 32767)。

 输出数据

一个数,满足ai < aj > ak (i < j < k)的个数。

样例输入

5

1 2 3 4 1

样例输出

6

分析:思路类似问题 A,先求出一个数左边有多少比它小,再求出一个数的右边有多少比它小。而问题 A 中已经知道了前面怎么求,那么求右边有多少比它大,可以把这个数组反过来存,问题就转化为求左边有多少比它小。

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include   <string>
#include   <vector>
#include   <cstdio>
#include    <queue>
#include    <stack>
#include    <ctime>
#include    <cmath>
#include      <map>
#include      <set>
#define INF 0x3fffffff
#define db1(x) cout<<#x<<"="<<(x)<<endl
#define db2(x,y) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<endl
#define db3(x,y,z) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<endl
#define db4(x,y,z,r) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#r<<"="<<(r)<<endl
#define db5(x,y,z,r,w) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#r<<"="<<(r)<<", "<<#w<<"="<<(w)<<endl
using namespace std;#define lowbit(i) ((i)&(-i))typedef struct node
{int val,pos;
}node;long long getsum(int x,int n,int c[])
{long long sum=0;for(int i=x;i>0;i-=lowbit(i))sum+=c[i];return sum;
}void update(int x,int v,int n,int c[])
{for(int i=x;i<=n;i+=lowbit(i))c[i]+=v;return;
}bool cmp(node a,node b)
{return a.val<b.val;
}int main(void)
{#ifdef testfreopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);clock_t start=clock();#endif //testint n;while(~scanf("%d",&n)){node num[n+5];int c1[n+5]={0},c2[n+5]={0},a[n+5]={0},b[n+5]={0};for(int i=0;i<n;++i)scanf("%d",&num[i].val),num[i].pos=i;sort(num,num+n,cmp);for(int i=0;i<n;++i){if(i==0||num[i].val!=num[i-1].val)a[num[i].pos]=i+1;else a[num[i].pos]=a[num[i-1].pos];}for(int i=0;i<n;++i)b[i]=a[n-1-i];long long ans=0;long long sum1[n+5]={0},sum2[n+5]={0};for(int i=0;i<n;++i){update(a[i],1,n,c1);sum1[i]=getsum(a[i]-1,n,c1);update(b[i],1,n,c2);sum2[n-1-i]=getsum(b[i]-1,n,c2);}for(int i=0;i<n;++i)ans+=sum1[i]*sum2[i];printf("%lld\n",ans);}#ifdef testclockid_t end=clock();double endtime=(double)(end-start)/CLOCKS_PER_SEC;printf("\n\n\n\n\n");cout<<"Total time:"<<endtime<<"s"<<endl;        //s为单位cout<<"Total time:"<<endtime*1000<<"ms"<<endl;    //ms为单位#endif //testreturn 0;
}

最后记录一下《算法笔记》书练习的 AC 代码:codeup/13.2树状数组 at master · maximusyoung007/codeup · GitHub

http://www.lryc.cn/news/2387409.html

相关文章:

  • 一键启动多个 Chrome 实例并自动清理的 Bash 脚本分享!
  • 4 月 62100 款 App 被谷歌下架!环比增长 28%
  • 图像分割全路线学习(结合论文)
  • Go语言之定义结构体(Struct)-《Go语言实战指南》
  • mediapipe标注视频姿态关键点(基础版加进阶版)
  • PCtoLCD2002如何制作6*8字符
  • SmartPlayer与VLC播放RTMP:深度对比分析延迟、稳定性与功能
  • Qt QPaintEvent绘图事件painter使用指南
  • 伪创新-《软件方法》全流程引领AI-第1章 04
  • win11如何重启
  • 【iOS】 锁
  • uni-app学习笔记十五-vue3页面生命周期(一)
  • Flink核心概念小结
  • 《软件工程》第 14 章 - 持续集成
  • 大模型 Agent 中的通用 MCP 机制详解
  • Navicat 17 SQL 预览时表名异常右键表名,点击设计表->SQL预览->另存为的SQL预览时,表名都是 Untitled。
  • Orpheus-TTS:AI文本转语音,免费好用的TTS系统
  • Python爬虫实战:研究Goose框架相关技术
  • webpack优化方法
  • STM32 Keil工程搭建 (手动搭建)流程 2025年5月27日07:42:09
  • MyBatis 框架使用与 Spring 集成时的使用
  • OpenGL Chan视频学习-7 Writing a Shader inOpenGL
  • 顶会新方向:卡尔曼滤波+目标检测
  • 数据库相关问题
  • 一起学数据结构和算法(二)| 数组(线性结构)
  • Linux基本指令篇 —— touch指令
  • 【后端高阶面经:消息队列篇】23、Kafka延迟消息:实现高并发场景下的延迟任务处理
  • Mac安装MongoDB数据库以及MongoDB Compass可视化连接工具
  • 城市地下“隐形卫士”:激光甲烷传感器如何保障燃气安全?
  • MySQL推出全新Hypergraph优化器,正式进军OLAP领域!