【题目链接】

点击打开链接

【算法】

先考虑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 ;
}

最新文章

  1. 【Win 10 应用开发】InkToolBar——涂鸦如此简单
  2. windows快捷键集锦
  3. 今天被PHP短标签给坑了
  4. Python第一模块
  5. bzoj4561: [JLoi2016]圆的异或并
  6. DB2建立不记录日志的表
  7. SQL 面试题(一)
  8. Make a dent in the universe
  9. 吞吐量(Throughput)、QPS、并发数、响应时间(RT)对系统性能的影响
  10. 二、AspNet Core添加EF的基本方法(简略版):
  11. connection reset by peer
  12. CF963D Frequency of String
  13. WPF xml配置文件里面的大于小于号转义
  14. laravel实现批量添加数据
  15. Codeforces 954D Fight Against Traffic(BFS 最短路)
  16. 用AI制作炫酷效果
  17. angularJS1笔记-(1)-多控制器
  18. JavaScript 实用技巧和写法建议
  19. 棋盘游戏---hdu1281(最大匹配)
  20. for 续4

热门文章

  1. Thread 1 cannot allocate new log 的处理办法
  2. 使用HttpWebRequest post数据时要注意UrlEncode
  3. Codevs 2756 树上的路径
  4. 【HDOJ6315】Naive Operations(线段树,树状数组)
  5. ES6__数据结构 Map
  6. HDU 6035 (虚树)(统计颜色)
  7. 洛谷——P2865 [USACO06NOV]路障Roadblocks
  8. UVA 12035 War Map
  9. java代码编译过程
  10. c++ static const