LightOJ 1085 All Possible Increasing Subsequences (DP&离散化&树状数组)

Posted synapse7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1085 All Possible Increasing Subsequences (DP&离散化&树状数组)相关的知识,希望对你有一定的参考价值。

http://lightoj.com/volume_showproblem.php?problem=1085


先说个很快的方法——二维思考,从右下往左上离散化:

/*0.364s,2860KB*/

#include<bits/stdc++.h>
using namespace std;
const int mx = 100005;
const int mod = 1000000007;

int tree[mx], a[mx], dis[mx], n;

///从右下往左上“看”
bool cmp(int x, int y)

	if (a[x] != a[y]) return a[x] < a[y];
	return x > y;


void add(int pos, int x)

	for (; pos <= n; pos += pos & -pos) tree[pos] = (tree[pos] + x) % mod;


int sum(int pos)

	int res = 0;
	for (; pos; pos -= pos & -pos) res = (res + tree[pos]) % mod;
	return res;


int main()

	int t, cas, i;
	scanf("%d", &t);
	for (cas = 1; cas <= t; ++cas)
	
		scanf("%d", &n);
		for (i = 1; i <= n; ++i) scanf("%d", &a[i]), dis[i] = i;
		sort(dis + 1, dis + n + 1, cmp);
		memset(tree, 0, sizeof(tree));
		for (i = 1; i <= n; i++) add(dis[i], sum(dis[i]) + 1);
		printf("Case %d: %d\\n", cas, sum(n));
	
	return 0;


然后是普遍的从左往右离散化的方法,但是太慢,而且还耗内存:

/*1.236s,7088KB*/

#include<bits/stdc++.h>
using namespace std;
const int mx = 100005;
const int mod = 1000000007;

int tree[mx], a[mx], n;
map<int, int> m;

void add(int pos, int x)

	for (; pos <= n; pos += pos & -pos) tree[pos] = (tree[pos] + x) % mod;


int sum(int pos)

	int res = 0;
	for (; pos; pos -= pos & -pos) res = (res + tree[pos]) % mod;
	return res;


int main()

	int t, cas, i, cnt, pos;
	map<int, int>::iterator it;
	scanf("%d", &t);
	for (cas = 1; cas <= t; ++cas)
	
		scanf("%d", &n);
		m.clear();
		for (i = 0; i < n; ++i) scanf("%d", &a[i]), m[a[i]];
		cnt = 0;
		for (it = m.begin(); it != m.end(); ++it) it->second = ++cnt;
		memset(tree, 0, sizeof(tree));
		for (i = 0; i < n; ++i) pos = m[a[i]], add(pos, sum(pos - 1) + 1);
		printf("Case %d: %d\\n", cas, sum(cnt));
	
	return 0;


以上是关于LightOJ 1085 All Possible Increasing Subsequences (DP&离散化&树状数组)的主要内容,如果未能解决你的问题,请参考以下文章

LightOJ 1085(树状数组+离散化+DP,线段树)

***Leetcode 894. All Possible Full Binary Trees

894. All Possible Full Binary Trees

leetcode_894. All Possible Full Binary Trees

894. All Possible Full Binary Trees

Leetcode 894. All Possible Full Binary Trees