题链:

http://poj.org/problem?id=3378

题解:

树状数组维护,高精度。

依次考虑以每个位置结尾可以造成的贡献。

假设当前位置为i,为了达到5个元素的要求,我们需要求出,在序列1~i-1中有多少个合法4元组$(a<b<c<d且A_a<A_b<A_c<A_d)$的最后那个元素是小于$A_i$的$(即为了满足a<b<c<d<i且A_a<A_b<A_c<A_d<A_i)$,求出这种四元组的个数,那么就是以i位置结尾可以贡献的答案。

所以我们用树状数组"D4"维护以权值x结尾的合法四元组的个数,那么对于当前的A_i,就只需要查询树状数组的[1~A_i-1]的区间的和,这个和便是应该贡献的答案。

然而为了维护以某一元素结尾的合法四元组的个数,我们不得不再用一个树状数组"D3"维护以权值x结尾的合法三元组的个数。

同理,为了维护以某一元素结尾的合法三元组的个数,还需要一个树状数组"D2"维护以权值x结尾的合法二元组的个数,然后是一个树状数组"D1"维护以权值x结尾的合法一元组的个数。。。。。。

然后就只需要对于依次枚举到的第i个元素,进行查询和更新树状数组就好了。

(本体比较恶心,爆longlong,就再弄一个高精度咯。)

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 50050
#define ll long long
using namespace std;
struct BigInt{
#define Bit 1000
int val[10],len;
BigInt(){len=1;memset(val,0,sizeof(val));}
void operator = (int rtm){
memset(val,0,sizeof(val));
len=0; do{
val[++len]=rtm%Bit; rtm/=Bit;
}while(rtm);
}
BigInt operator + (const BigInt &rtm) const{
BigInt now; now.len=max(rtm.len,len);
for(int i=1;i<=now.len;i++){
now.val[i]+=val[i]+rtm.val[i];
now.val[i+1]+=now.val[i]/Bit;
now.val[i]%=Bit;
}
while(now.val[now.len+1]) now.len++;
return now;
}
void Print(){
printf("%d",val[len]);
for(int i=len-1;i;i--) printf("%03d",val[i]);
}
};
struct BIT{
BigInt val[MAXN]; int n;
int Lowbit(int x){return x&-x;}
void Reset(int _n){n=_n; while(_n) val[_n]=0,_n--;}
void Modify(int p,BigInt v){
while(p<=n) val[p]=val[p]+v,p+=Lowbit(p);
}
BigInt Query(int p){
static BigInt ret; ret=0;
while(p)
ret=ret+val[p],p-=Lowbit(p);
return ret;
}
}D1,D2,D3,D4;
int A[MAXN],tmp[MAXN];
int N,tnt;
BigInt ANS,t,one;
int main(){
one=1;
while(~scanf("%d",&N)){
for(int i=1;i<=N;i++)
scanf("%d",&A[i]),tmp[i]=A[i];
sort(tmp+1,tmp+N+1);
tnt=unique(tmp+1,tmp+N+1)-tmp-1;
for(int i=1;i<=N;i++)
A[i]=lower_bound(tmp+1,tmp+tnt+1,A[i])-tmp;
D1.Reset(tnt); D2.Reset(tnt);
D3.Reset(tnt); D4.Reset(tnt); ANS=0;
for(int i=1;i<=N;i++){
D1.Modify(A[i],one); t=D1.Query(A[i]-1);
D2.Modify(A[i],t); t=D2.Query(A[i]-1);
D3.Modify(A[i],t); t=D3.Query(A[i]-1);
D4.Modify(A[i],t);
t=D4.Query(A[i]-1);
ANS=ANS+t;
}
ANS.Print(); printf("\n");
}
return 0;
}

  

●POJ 3378 Crazy Thairs的更多相关文章

  1. [POJ 3378] Crazy Thairs

    Link: POJ 3378 传送门 Solution: 按序列长度$dp$, 设$dp[i][j]$为到第$i$个数,符合要求的序列长度为$j$时的序列个数, 易得转移方程:$dp[i][j]=\s ...

  2. POJ 3378 Crazy Thairs(树状数组+DP)

    [题目链接] http://poj.org/problem?id=3378 [题目大意] 给出一个序列,求序列中长度等于5的LIS数量. [题解] 我们发现对于每个数长度为k的LIS有dp[k][i] ...

  3. poj 3378 Crazy Thairs dp+线段树+大数

    题目链接 题目大意: 给出n个数, 让你求出有多少个5元组满足 i < j < k < l < m并且ai < aj < ak < al < am 我们 ...

  4. 【POJ】3378 Crazy Thairs(树状数组+dp+高精)

    题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了, ...

  5. [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)

    树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...

  6. poj 1200 Crazy Search(hash)

    题目链接:http://poj.org/problem?id=1200 思路分析:从数据来看,该题目使用线性时间算法,可见子串的比较是不可能的:使用hash可以在常数时间内查找,可以常数时间内判重, ...

  7. POJ 1200 Crazy Search(字符串简单的hash)

    题目:http://poj.org/problem?id=1200 最近看了一个关于hash的问题,不是很明白,于是乎就找了些关于这方面的题目,这道题是一道简单的hash 字符串题目,就先从他入手吧. ...

  8. POJ – 1200 Crazy Search

    http://poj.org/problem?id=1200 #include<iostream> #include<cstring> using namespace std; ...

  9. poj 3378 二维树状数组

    思路:直接用long long 保存会WA.用下高精度加法就行了. #include<map> #include<set> #include<cmath> #inc ...

随机推荐

  1. Beta 第四天

    今天遇到的困难: 百度位置假死的问题研究发现并不是源于代码的问题,而是直接运行在主线程中会出现诸多问题 Fragment碎片刷新时总产生的固定位置的问题未果 今天完成的任务: 陈甘霖:修复了部分Bug ...

  2. 20162311 实验三 敏捷开发与XP实践 实验报告

    20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...

  3. 轻量级django 一

    from django.http import HttpResponse from django.conf.urls import url from django.conf import settin ...

  4. JAVA和Android的回调机制

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以 前不理解什么叫回 ...

  5. VS2013 重装 无法打开项目

    今天遇到的奇葩BUG,耗时我一下午,现在跟大家说道说道. 今天重装系统,让各种开发环境开发工具自然要重装一次,最后装完VS2013,然后刚好客户打电话要改点东西,然后我就双击项目准备打开改,然后奇葩来 ...

  6. sublime安装 和 插件安装

    先从官网下载sublime   https://www.sublimetext.com/3 安装完毕后 快捷键ctrl+` 或者View->Show Console,输入如下代码(sublime ...

  7. Python内置函数(61)——eval

    英文文档: eval(expression, globals=None, locals=None) The arguments are a string and optional globals an ...

  8. SpringCloud的注解:EnableEurekaClient vs EnableDiscoveryClient

    What's the difference between EnableEurekaClient and EnableDiscoveryClient? In some applications, I ...

  9. 用Jmeter实现mysql数据库的增删查改

    主要是参考虫师的“使用JMeter创建数据库(Mysql)测试”. 1.打开Jmeter,点击测试计划 链接:https://pan.baidu.com/s/1ZtaZ6IC_0DRjSlXkjslY ...

  10. 双击表,powerdesigner pdm 没有 comment列(no comment)