【TJOI 2014】 上升子序列
【题目链接】
【算法】
先考虑50分的做法 :
f[i]表示以i结尾的本质不同的上升子序列的个数
则f[i] = sigma(f[j]) (j < i,a[j] < a[i]),注意如果a[j]不止一个,只需加上下标最大的即可,否则会重复计数
那么,100分的做法,其实就是用树状数组来优化这个东西,注意因为a[i]最大10^9,所以要离散化
【代码】
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + ;
const int MOD = 1e9 + ; int i,n,ans,len;
int a[MAXN],num[MAXN],rk[MAXN],pre[MAXN],val[MAXN]; class BinaryIndexedTree
{
private :
int c[MAXN];
public :
inline int lowbit(int x)
{
return x & (-x);
}
inline void modify(int pos,int val)
{
int i;
for (i = pos; i <= n; i += lowbit(i)) c[i] = (c[i] + val) % MOD;
}
inline int query(int pos)
{
int i,ans = ;
for (i = pos; i; i -= lowbit(i)) ans = (ans + c[i]) % MOD;
return ans;
}
} BIT; template <typename T> inline void read(T &x)
{
int f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
template <typename T> inline void write(T x)
{
if (x < )
{
putchar('-');
x = -x;
}
if (x > ) write(x/);
putchar(x%+'');
}
template <typename T> inline void writeln(T x)
{
write(x);
puts("");
} int main()
{ read(n);
for (i = ; i <= n; i++)
{
read(a[i]);
num[i] = a[i];
}
sort(num+,num+n+);
len = unique(num+,num+n+) - num - ;
for (i = ; i <= n; i++) rk[i] = lower_bound(num+,num+len+,a[i]) - num;
for (i = ; i <= n; i++)
{
val[i] = BIT.query(rk[i] - ) + ;
BIT.modify(rk[i],(val[i] - val[pre[rk[i]]] + MOD) % MOD);
pre[rk[i]] = i;
} for (i = n; i >= ; i--)
{
if (pre[rk[i]])
{
ans = (ans + val[i] - ) % MOD;
pre[rk[i]] = ;
}
} writeln(ans); return ;
}
【TJOI 2014】 上升子序列的更多相关文章
- [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)
[BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap) 题面 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...
- [TJOI]2013 最长上升子序列
这个题据说是Splay,或者说是平衡树的模板题,但是我还是不会做--唉-- \(\color{red}{Description}\) 给定一个序列,初始为空.现在我们将\(1\)到\(N\)的数字插入 ...
- 2014年第五届蓝桥杯C/C++程序设计本科B组决赛
1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...
- 2.16 最长递增子序列 LIS
[本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...
- POJ1159——Palindrome(最长公共子序列+滚动数组)
Palindrome DescriptionA palindrome is a symmetrical string, that is, a string read identically from ...
- 编程算法 - 最长上升子序列问题 代码(C)
最长上升子序列问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有一个长为n的数列a. 请求出这个序列中最长上升子序列的长度. 最长上升子序 ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- 2014华为机试西安地区B组试题
2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...
- 2014年CCNU-ACM暑期集训总结
2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...
随机推荐
- 【尺取】HDU String
http://acm.hdu.edu.cn/showproblem.php?pid=5672 [题意] 给定一个小写英语字母组成的字符串,求这个字符串一共包含多少个至少有m个不同字母的连续子序列 [思 ...
- vs2010 静态使用 opencv 2.46 库
下载opencv2.46的库,假设解压到OpenCV246,设置如下: 在工程的c++的include目录下添加:OpenCV246\opencv\build\include 在工程的c++的lib目 ...
- SUSE linux使用zypper 安装软件-比yum更好用
1. How to install "wget" command in Linux and how to use multiple : https://www.cyberciti. ...
- SOJ 4467 easyproblem 2【欧拉函数 最大公因数和】
这题wa的莫名其妙,郁闷了一下午,队友暴力一发跟我答案也是一样.后来队友说试试把%I64d换成%lld,果然一下ac...(暴露了在soj做题少.. ac之后排在ranklist的最后一名...目前也 ...
- hdu 3943
数位dp #include <cstdio> #include <cstdlib> #include <cmath> #include <stack> ...
- java IO与NIO
场景:IO适用于大而少,NIO适用于小而多 转载:https://www.cnblogs.com/kzfy/p/5063467.html 传统的socket IO中,需要为每个连接创建一个线程,当并发 ...
- Spring基于Java的配置
以下内容引用自http://wiki.jikexueyuan.com/project/spring/java-based-configuration.html: 基于Java的配置选项,可以使你在不用 ...
- Java的基本运算符
以下内容引用自http://wiki.jikexueyuan.com/project/java/basic-operators.html: Java针对操控变量提供了一组丰富的运算符.可以将所有的Ja ...
- Ribbon简介
Ribbon简介
- Java编程50题
[程序1] 题目:古典问题:有一对兔子.从出生后第3个月起每一个月都生一对兔子,小兔子长到第三个月后每一个月又生一对兔子,假如兔子都不死.问每一个月的兔子总数为多少? //这是一个菲波拉契 ...