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 ...
随机推荐
- jsonp封装
//jsonp的封装函数 function jsonp(url,parmter,callback){ //创建script标签 var script=document.createElement('s ...
- android 分辨率自适应
1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 A ...
- 一个封装HTTP请求的函数(C++)
这里封装了HTTP请求的,支持GET与POST,并支持各种参数组合,调用方式很简单使用DEVWEB::WebRequest(string(“http://www.luaie.com/”),ret);就 ...
- Linux - Eclipse CDT + GCC 安装(2014.10.2)
Eclipse CDT + GCC 安装 (2014.10.2) 本文地址:http://blog.csdn.net/caroline_wendy 1. 安装Eclipse,在官方站点下载Eclips ...
- SVN 代码下载,上传
代码下载,如: svn co https://99.99.16.1:8080/svn/pavenas/webpy --username bg 代码上传,如: svn commit -m "备 ...
- 在Ubuntu下的Apache上建立新的website,以及enable mono
1. 在Apache下建立新的web site a. $>cd /etc/apache2/ b. $>vi ports.conf 填加Listen 8090(注意不要打开8080,因为To ...
- 前端笔试题目总结——应用JavaScript函数递归打印数组到HTML页面上
数组如下: var item=[{ name:'Tom', age:70, child:[{ name:'Jerry', age:50, child:[{ name:'William', age:20 ...
- (转)WITH (NOLOCK)
缺点: 1.会产生脏读 2.只适用与select查询语句 优点: 1.有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%. 2.可以用于inner join 语句 脏读: 一个用 ...
- Swift 流程控制
import Foundation ...{ == { print(index) } } // 可选变量 类型后面加? var myName:String?="jikexueyuan&quo ...
- 报错:/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.29.5/UITableView.m:7943解决方法
环境:Xcode7.1.1 详细错误: *** Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], ...