POJ 3378
查找长度为5的上升序列总数
用的树状数组+高精度
用树状数组求在i前面比i小的数有几个
用的4个树状数组,A[i][j]表示长度为i的以j为结尾的个数,A[i][j]=A[i-1][1....flag[n]]
对数组下标不能为0一直不太理解,会发生死循环
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 50005
#define MOD 10000
struct e{
int w,id;
bool operator <(const e &v) const
{
return w<v.w;
}
}a[N];
__int64 A[4][N];
int flag[N],ans[10],n;
int lowbit(int x){ return x&-x; }
void update(int x,int y,__int64 w)
{
while(y<n)
{
A[x][y]+=w;
y+=lowbit(y);
} }
__int64 getsum(int x,int y)
{
__int64 sum=0;
while(y>0)
{
sum+=A[x][y];
y-=lowbit(y);
}
return sum;
}
int ans_sum(__int64 w) //高精度取模
{
int i;
i=0;
while(w>0)
{
ans[i]+=w%MOD;
if(ans[i]>=MOD)
{
ans[i]-=MOD;
ans[i+1]++;
}
w/=MOD;
i++;
}
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
// memset(arr,0,sizeof(arr));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].w);
a[i].id=i;
}
sort(a,a+n);
memset(ans,0,sizeof(ans));
memset(A,0,sizeof(A));
int mm=0;
flag[a[1].id]=++mm;
for(i=2;i<=n;i++)
{
if(a[i-1].w<a[i].w)
flag[a[i].id]=++mm;
else
flag[a[i].id]=mm;
}
for(i=1;i<=n;i++)
{
__int64 x=1;
for(j=0;j<4;j++)
{
update(j,flag[i],x); //x为长度为j-1的总数
x=getsum(j,flag[i]-1);
}
ans_sum(x); //对满足条件的进行求和
}
int t=0;
for(i=9;i>=0;i--)
{
if(!t&&ans[i]>0)
{
printf("%d",ans[i]);
t=1;
}
else if(t)
printf("%04d",ans[i]);
}
if(!t) printf("0");
printf("\n");
}
return 0;
}
POJ 3378的更多相关文章
- [POJ 3378] Crazy Thairs
Link: POJ 3378 传送门 Solution: 按序列长度$dp$, 设$dp[i][j]$为到第$i$个数,符合要求的序列长度为$j$时的序列个数, 易得转移方程:$dp[i][j]=\s ...
- ●POJ 3378 Crazy Thairs
题链: http://poj.org/problem?id=3378 题解: 树状数组维护,高精度. 依次考虑以每个位置结尾可以造成的贡献. 假设当前位置为i,为了达到5个元素的要求,我们需要求出,在 ...
- POJ 3378 Crazy Thairs(树状数组+DP)
[题目链接] http://poj.org/problem?id=3378 [题目大意] 给出一个序列,求序列中长度等于5的LIS数量. [题解] 我们发现对于每个数长度为k的LIS有dp[k][i] ...
- poj 3378 二维树状数组
思路:直接用long long 保存会WA.用下高精度加法就行了. #include<map> #include<set> #include<cmath> #inc ...
- poj 3378 Crazy Thairs dp+线段树+大数
题目链接 题目大意: 给出n个数, 让你求出有多少个5元组满足 i < j < k < l < m并且ai < aj < ak < al < am 我们 ...
- poj很好很有层次感(转)
OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...
- POJ题目分类推荐 (很好很有层次感)
著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...
- 【POJ】3378 Crazy Thairs(树状数组+dp+高精)
题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了, ...
- POJ刷题记录 (。・`ω´・)(Progress:6/50)
1743:前后作差可以转化成不可重叠最长公共字串问题,运用后缀数组解决(参考罗穗骞神犇的论文) #include <cstdio> #include <cstring> #in ...
随机推荐
- css文本样式
1. body{ color:aqua; /*可继承的颜色*/ text-align: center; /*文本对齐方式*/ } 2.缩进: index.html <!DOCTYPE html& ...
- DataGrid横向滚动条无法拖动的问题
项目中经常遇到一些问题,这些问题可能很简单,但是之前从未遇到,可能经过了一番谷歌,也可能是查阅了MSDN,或是借鉴了大牛博客,逐渐有了些眉目,为了将这些东西落地,也为了将来之不易的东西记录下来,以备今 ...
- [教程] 神器i9100刷基带与内核的方法!(兼带ROOT方法)
http://bbs.hiapk.com/thread-2647905-1-1.html ------何为基带?何为内核? 为什么刷基带,为什么刷内核?!!! 基带:基带(Baseband)是手机中的 ...
- 【小程序开发】微信小程序开发中遇到的那些坑...
第一坑: 设置了三个tabBar,却默认显示第二个,不能展示我的第一个[首页]. "list": [{ "pagePath":"page/KTGJ/i ...
- Sqlserver更新数据表xml类型字段内容某个节点值的脚本
GO USE [JC2010_MAIN_DB] 1.新建备份表JobObjectVersion_JCSchemVersion_BCK) GO IF EXISTS (SELECT * FROM sys. ...
- android4.4 settings 中控制卡1 卡2都振动
在package/app/Settings/src/com/android/settings/SoundSettings.java
- android 绘图
在main.xml文件中代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- Java多线程练习三
public class ex5 { public static void main(String [] args) { thread5 t1 = new thread5(); thread5_1 t ...
- Request.ServerVariables 服务器环境变量
Request.ServerVariables["Url"] 返回服务器地址 Request.ServerVariables["Path_Info"] 客户端提 ...
- C# List<T>转为 DataTable
// remove "this" if not on C# 3.0 / .NET 3.5 public static System.Data.DataTable ConvertTo ...