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 ...
随机推荐
- javascript算法挑战
1.翻转字符串算法挑战: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 function reverseString(str) ...
- windows使用命令行杀进程
在windows有时使用任务管理器杀进程,一直杀不掉: 这个时候,可以使用命令行: 先使用tasklist 命令查看当前系统中的进程列表,然后针对你要杀的进程使用taskkill命令 如要杀nginx ...
- 正则表达式:网页爬虫:从TXT中获取邮箱地址(获取的练习,缺点:一行只能匹配一个)
import java.util.regex.*; import java.io.*; class L { public static void main(String[] args) throws ...
- iOS蓝牙4.0协议简单介绍
iOS开发蓝牙4.0的框架是CoreBluetooth,本文主要介绍CoreBluetooth的使用,关于本文中的代码片段大多来自github上的一个demo,地址是myz1104/Bluetooth ...
- 使用VS Code调试TypeScript游戏程序JsTankGame成功!!!
TypeScript游戏程序JsTankGame不是本人写的,是从CSDN下载的. JsTankGame是用Visual Studio开发的,因此在Visual Studio下调试非常顺畅.本人尝试用 ...
- 网页调用QQ聊天
把下面的复制到地址栏里,QQ号为你要聊天的人的qq号,如果你没有登录你自己的qq,首先会调出qq登录窗体. tencent://message/?uin=QQ号
- JobDeer 的《程序员必读的职业规划书》
JobDeer 的<程序员必读的职业规划书> 关键字 持续性,人生规划,职业规划 概念 职业规划三部分: 职业定位 目标设定 通道设计 职业价值论: 能为公司做什么 同样的能力再不同公司价 ...
- SqlServer 不同服务器之间数据库连接、数据库登录、数据传递
需求:我是本地数据库想纯SQL访问其它服务器上的数据库,而不使用数据库客户端的连接.这里面就想到了数据库link,通过下面的代码进行创建以后,就可以在本地对链接的服务器数据库进行操作了--添加SQLS ...
- AngularJs练习Demo18 Resource
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- 查看Linux相关信息
1."uname -a ",可显示电脑以及操作系统的相关信息. 2."cat /proc/version",说明正在运行的内核版本. 3."cat / ...