【HDU4991】树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4991
用f[i][j] 表示 前i个数以第i个数结尾的合法子序列的个数,则递推式不难写出:
f[i][j] = sum(f[k][j - 1]); 其中 k < i, 且a[k] < a[i]; 边界:f[i][1] = 1; 显然需要用数据结构来优化查询
如果不考虑离散的话,用一个数据结构,记录节点为a[i]的f值,同时维护一个区间f值之和,那么f[i][j] = query(0, a[i] - 1);然后考虑特定的顺序用f值更新数据结构中的信息
具体见代码(树状数组):
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <stack>
#include <string>
#define mem0(a) memset(a, 0, sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define lr rt << 1
#define rr rt << 1 | 1
#define eps 0.0001
#define lowbit(x) ((x) & -(x))
#define memc(a, b) memcpy(a, b, sizeof(b))
typedef char Str[];
using namespace std;
#define LL long long
#define DL double map<int, int> Hash;
int mol = ;
int a[], f[][], b[], R[], c[], N, n, m; void init()
{
sort(a + , a + + n);
N = ;
for(int i = ; i <= n; i++) {
if(a[i] == a[i - ] && i > ) continue;
Hash[a[i]] = ++N;
}
}
int query(int p)
{
int ans = ;
while(p) {
ans += c[p];
if(ans >= mol) ans -= mol;
p -= lowbit(p);
}
return ans;
}
void update(int p, int x)
{
while(p <= N) {
c[p] += x;
if(c[p] >= mol) c[p] -= mol;
p += lowbit(p);
}
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
while(~scanf("%d%d", &n, &m)) {
for(int i = ; i <= n; i++) {
scanf("%d", a + i);
}
memc(b, a);
init();
mem0(f);
//puts("d");
for(int i = ; i <= n; i++) f[i][] = ;
for(int i = ; i <= n; i++) R[i] = Hash[b[i]];
for(int j = ; j <= m; j++) {
mem0(c);
for(int i = ; i <= n; i++) {
f[i][j] = query(R[i] - );
update(R[i], f[i][j - ]);
//cout<< i<< " "<< j<< " "<< f[i][j]<< endl;
}
}
int ans = ;
for(int i = m; i <= n; i++) {
ans += f[i][m];
if(ans >= mol) ans -= mol;
}
cout<< ans<< endl;
}
return ;
}
另外用线段树写了一下, 不过超时(2000+ms)了,线段树才不到500ms,由此可见能用树状数组决不用线段树,递归线段树常数太大了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <stack>
#include <string>
#define mem0(a) memset(a, 0, sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define lr rt << 1
#define rr rt << 1 | 1
#define eps 0.0001
#define lowbit(x) ((x) & -(x))
#define memc(a, b) memcpy(a, b, sizeof(b))
typedef char Str[];
using namespace std;
#define LL long long
#define DL double
struct seg{
int sum;
}tree[ << ];
map<int, int> Hash;
int mol = ;
int a[], f[][], b[], R[], N, n, m; void init()
{
sort(a + , a + + n);
N = ;
for(int i = ; i <= n; i++) {
if(a[i] == a[i - ] && i > ) continue;
Hash[a[i]] = ++N;
}
}
void build(int l, int r, int rt)
{
tree[rt].sum = ;
if(l == r) return;
int m = (l + r) >> ;
build(lson);
build(rson);
}
void pushUP(int rt)
{
tree[rt].sum = tree[rt << ].sum + tree[rt<< | ].sum;
if(tree[rt].sum >= mol) tree[rt].sum -= mol;
}
void update(int p, int x, int l, int r, int rt)
{
if(l == r) {
tree[rt].sum += x;
if(tree[rt].sum >= mol) tree[rt].sum -= mol;
return;
}
int m = (l + r) >> ;
if(p <= m) update(p, x, lson);
else update(p, x, rson);
pushUP(rt);
}
int query(int L, int R, int l, int r, int rt)
{
if(L <= l && r <= R) {
return tree[rt].sum;
}
int m = (l + r) >> , res = ;
if(L <= m) res+= query(L, R, lson);
if(R > m) res += query(L, R, rson);
if(res >= mol) res -= mol;
return res;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
while(~scanf("%d%d", &n, &m)) {
for(int i = ; i <= n; i++) {
scanf("%d", a + i);
}
memc(b, a);
init();
mem0(f);
//puts("d");
for(int i = ; i <= n; i++) f[i][] = ;
for(int i = ; i <= n; i++) R[i] = Hash[b[i]];
for(int j = ; j <= m; j++) {
build(, N, );
for(int i = ; i <= n; i++) {
if(R[i] > ) f[i][j] = query(, R[i] - , , N, );
update(R[i], f[i][j - ], , N, );
}
}
int ans = ;
for(int i = m; i <= n; i++) {
ans += f[i][m];
if(ans >= mol) ans -= mol;
}
cout<< ans<< endl;
}
return ;
}
【HDU4991】树状数组的更多相关文章
- hdu4991 树状数组+dp
这题说的是给了一个序列长度为n 然后求这个序列的严格递增序列长度是m的方案有多少种,如果用dp做那么对于状态有dp[n][m]=dp[10000][100],时间复杂度为n*m*n接受不了那么想想是否 ...
- HDU4991 Ordered Subsequence (树状数组优化DP)
dp[i][j]表示以a[i]结尾的长度为j的上升子序列个数. 方程:dp[i][j]=sum(dp[k][j-1]),a[k]<a[i],1<=k<i. 求解目标:sum(dp[k ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
随机推荐
- es技术规划
一.业务背景 es服务当前没有专门的部门负责维护和开发,交由各端自行负责维护,随着公司业务查询和统计需求非常多,会面临居多方面问题和挑战: 无人(专业RD或部门)负责 无专业的人进行维护,遇到问题几乎 ...
- chrome Provisional headers are shown错误提示(转载)
今天开发时遇到了一个问题,由于要做一个支付等待页,大概的意思就是点击支付之后,跳出来一个页面,告知用户正在跳转到支付页面.这个时候问题来了,指鹤要做的这个静态支付等待页中有图片,而为了要让这个静态页面 ...
- Web中间件常见漏洞
IIS Internet Information Services--windows 解析漏洞 IIS 6.x 基于文件名:该版本默认会将 *.asp;.jpg 此种格式的文件名,当成 Asp 解析, ...
- token认证和理解
认知篇:https://blog.csdn.net/FYGu18/article/details/89345490 token失效篇认知:https://segmentfault.com/q/1010 ...
- 关于flex弹性布局
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
- [QT] QProcess finished 信号,关联的 slot 必须检查返回码
void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus)
- 基于 Docker 构建企业 Jenkins CI平台
持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous Deployment,CD):部 ...
- T-SQL字符串函数
整理下MSSQL中有关时间的函数,博客记录之. ASCII 原型:ASCII ( character_expression ) 返回值:int 类型值 功能:返回输入字符串最左边的一个字符的ASCII ...
- Scala教程之:函数式的Scala
文章目录 高阶函数 强制转换方法为函数 方法嵌套 多参数列表 样例类 比较 拷贝 模式匹配 密封类 单例对象 伴生对象 正则表达式模式 For表达式 Scala是一门函数式语言,接下来我们会讲一下几个 ...
- sed 和 awk
sed [选项] 动作 文件 -n #取消默认输出 ,有n必须要有p,有p加了n才不会有默认输出 -i #真正的替换,修改 -r #支持扩展正则 (* [A-z] '|') 内部命令: p #打印 - ...