【金凌试题】数列 可持久
来源:互联网 发布:高中软件 编辑:程序博客网 时间:2024/04/30 00:48
题目描述
一个简单的数列问题:给定一个长度为n的数列,求这样的三个元素ai, aj, ak的个数,满足ai < aj > ak,且i < j < k。
题目大意
求区间有多少数比给定的vl小。
数据范围
(n <= 50000)
样例输入
5
1 2 3 4 1
样例输出
6
解题思路
应该是线段树(树状数组)的模板题。结果不知道为什么用了可持久权值线段树。不管了233。
代码
#include <bits/stdc++.h>using namespace std;inline int Getint(){int x=0,f=1;char ch=getchar();while('0'>ch||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}int vl[50005],rt[50005],cnt=0;struct node{ int L,r,son[2],Sum,mid;}Tree[1000005];void Build(int &v,int L,int r){ Tree[v=++cnt]=(node){L,r,0,0,0,(L+r)/2}; if(L==r)return; Build(Tree[v].son[0],L,(L+r)/2); Build(Tree[v].son[1],(L+r)/2+1,r);}void Insert(int &New,int Old,int val){ if(!Old)return; Tree[New=++cnt]=Tree[Old]; Tree[New].Sum++; if(val<=Tree[New].mid)Insert(Tree[New].son[0],Tree[Old].son[0],val); else Insert(Tree[New].son[1],Tree[Old].son[1],val);}long long Ask(int New,int Old,int val){ if(!Old||val<=Tree[New].L)return 0; if(Tree[New].r<val)return Tree[New].Sum-Tree[Old].Sum; return Ask(Tree[New].son[0],Tree[Old].son[0],val)+Ask(Tree[New].son[1],Tree[Old].son[1],val);}long long Ans=0;int main(){ int n=Getint(); Build(rt[0],0,50001); for(int i=1;i<=n;i++)vl[i]=Getint(); for(int i=1;i<=n;i++)Insert(rt[i],rt[i-1],vl[i]); for(int i=2;i<n;i++)Ans+=Ask(rt[i-1],rt[0],vl[i])*Ask(rt[n],rt[i],vl[i]); cout<<Ans<<"\n"; return 0;}
0 0
- 【金凌试题】数列 可持久
- 【金凌模拟试题】:数列
- 初来乍到,盼可持久
- 可持久化数据结构
- 可持久化数据结构
- 可持久化二项堆
- bzoj3489 -- 可持久化树套树
- bzoj3489,可持久化树套树
- 可持久化trie
- 可持久化。
- 可持久化treap
- Sequence 可持久化树套树
- 可持久化Treap
- 可持久化Treap
- 可持久化Treap
- 可持久化数据结构
- 历届试题 波动数列
- 历届试题 波动数列
- 京东,淘宝,易迅三大网站是如何用CSS绘制三角形的
- linux下测试磁盘的读写IO速度(IO物理测速)
- Java对象转为Json串
- 堆的操作——push/pop
- 移动端无法获取event.clientX和event.clientY的解决办法
- 【金凌试题】数列 可持久
- git ignore 添加忽略文件不生效解决办法
- 第二十四讲项目四 个人所得税计算器if语句版
- Android drawable不同文件夹的区别
- 春 诗歌2首
- 相位噪声@40 MHz的含义
- sql语句中IN()的使用经验
- 读书笔记之单例模式
- 接上一篇腾讯2016年微信红包编程题