【洛谷1637】三元上升子序列

来源:互联网 发布:阿里云服务器流量租用 编辑:程序博客网 时间:2024/06/04 01:19

题面

题目描述

Erwin最近对一种叫”thair”的东西巨感兴趣。。。

在含有n个整数的序列a1,a2……an中,

三个数被称作”thair”当且仅当i< j< k且ai< aj< ak

求一个序列中”thair”的个数。

输入输出格式

输入格式:

开始一个正整数n,

以后n个数a1~an。

输出格式:

“thair”的个数

Input

4
2 1 3 4

Output

2

Input

5
1 2 2 3 4

Output

7
/*
7个”thair”分别是
1 2 3
1 2 4
1 2 3
1 2 4
1 3 4
2 3 4
2 3 4
*/

说明

约定 30%的数据n<=100
60%的数据n<=2000
100%的数据n<=30000
大数据随机生成
0<=a[i]<=maxlongint

题解

原来做过一道极其类似的题目
对于任意一个选定的数aj而言
要求的答案即是
1~j-1中比aj小的数的个数与
j+1~n中比aj大的数的个数
的乘积的和
求出数的个数可以直接使用树状数组
最后直接统计结果就行了
但是,考虑到N的范围很小
但是ai< maxlongint
因此,如果不使用离散化的话,可能会炸空间
好了。说了这里
直接上代码了:

//ai在maxlongint内,不离散化数组开不下。。。 #include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<map>#include<algorithm>using namespace std;#define MAX 40000#define INF 30000int n;inline int read(){    register int x=0,t=1;    register char ch=getchar();    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();    if(ch=='-'){t=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}    return x*t;}struct Node{       int a;//数值        int i;//位置 }Q[MAX];bool operator <(Node a,Node b){       return a.a<b.a;}int c[MAX*4];int a[MAX],t1[MAX],t2[MAX];inline int lowbit(int x){       return x&(-x);}inline void update(int x){       while(x<=n)       {             c[x]+=1;             x+=lowbit(x);       }}inline int get(int x){       int sum=0;       while(x>0)       {             sum+=c[x];             x-=lowbit(x);       }       return sum;}int main(){       n=read();       for(int i=1;i<=n;++i)          Q[i]=(Node){read(),i};       //离散化       sort(&Q[1],&Q[n+1]);       for(int i=1;i<=n;++i)        {            if(Q[i].a!=Q[i-1].a||i==1)                a[Q[i].i]=i;            else                a[Q[i].i]=a[Q[i-1].i];       }       //树状数组       //第一遍,求出前面所有数中,比它小的个数       for(int i=1;i<=n;++i)       {              t1[i]=get(a[i]-1);              update(a[i]);       }       memset(c,0,sizeof(c));       //第二遍,求出后面所有数中,比它大的个数       for(int i=n;i>=1;--i)       {              t2[i]=get(n-a[i]);              update(n-a[i]+1);       }       //最后求和       long long ans=0;       for(int i=1;i<=n;++i)          ans+=t1[i]*t2[i];       cout<<ans<<endl;       return 0; }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑死机了怎么办 也不能关机了 还没发货淘宝退款卖家不处理怎么办 还没发货申请退款卖家不处理怎么办 快递写错电话被更改收货信息怎么办 货在派送中快递地址填错了怎么办 老板损坏了你保管的器材怎么办 闲鱼买家说不合适要退货怎么办 日本邮便局的单号我忘了怎么办 小米盒子自带播放器被删除了怎么办 在电视上装了央视影音要升级怎么办 用现金支付货款没有了证据怎么办 楚楚街不发货客服不理人怎么办 厨房那面墙借用别人的怎么办 天猫买东西商家不给发货怎么办 在唯品会上买的水果坏了怎么办 美团极速退款后商家仍然送餐怎么办 我的拼多多商家密码忘了怎么办 特约金服扣款连续扣了两次怎么办? 拼多多拒绝退款联系客服退款怎么办 镇江新设名称申报中字号怎么办 创维电视只有声音没有图像怎么办 京东E卡有密码忘记卡号怎么办? 香香鞋上的饰品老掉怎么办 联壁金融资金冻结提现不出来怎么办 联壁金融提现不到帐怎么办 联壁金融提现迟迟不到帐怎么办 客户说平安福现金价值低怎么办 2个月宝宝肚脐凸出来怎么办 西安华润万家预付卡丢了怎么办 租房签了一年合同想走怎么办 京东寄包裹在速递易里面该怎么办 翼码科技辅助码被删掉了怎么办 用别人的身份证注册的手机号怎么办 大v线做到假线了怎么办 有个摄像头网段不同搜不到怎么办 百度网盘离线下载有违规内容怎么办 抖音上传的照片与音乐不同步怎么办 社保卡里面的钱用完了怎么办 医保卡里面的钱用完了怎么办 手机通知栏变成了搜索栏怎么办 小米手机账号密码忘了手机号怎么办