题目描述

求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果。


题解

树状数组

傻逼题,离散化后直接使用树状数组统计即可。由于要求本质不同,因此一个数要减去它前一次出现时的贡献(即以它上一次出现的位置为最后一个元素的上升子序列数目)统计到答案中。

由于要包含至少两个元素,因此还需要减掉不同数的数目。

时间复杂度 $O(n\log n)$

#include <cstdio>
#include <algorithm>
#define N 100010
#define mod 1000000007
using namespace std;
int n , a[N] , v[N] , pos[N] , last[N] , val[N] , f[N];
inline void add(int x , int a)
{
int i;
for(i = x ; i <= n ; i += i & -i)
f[i] = (f[i] + a) % mod;
}
inline int query(int x)
{
int i , ans = 0;
for(i = x ; i ; i -= i & -i)
ans = (ans + f[i]) % mod;
return ans;
}
int main()
{
int i , sum = 0;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i]) , v[i] = a[i];
sort(v + 1 , v + n + 1);
for(i = 1 ; i <= n ; i ++ )
{
a[i] = lower_bound(v + 1 , v + n + 1 , a[i]) - v;
if(!pos[a[i]]) sum ++ ;
last[i] = pos[a[i]] , pos[a[i]] = i;
}
for(i = 1 ; i <= n ; i ++ ) val[i] = query(a[i] - 1) + 1 , add(a[i] , (val[i] - val[last[i]] + mod) % mod);
printf("%d\n" , (query(n) - sum + mod) % mod);
return 0;
}

【bzoj5157】[Tjoi2014]上升子序列 树状数组的更多相关文章

  1. bzoj5157: [Tjoi2014]上升子序列(树状数组LIS)

    5157: [Tjoi2014]上升子序列 题目:传送门 题解: 学一下nlogn的树状数组求最长上生子序列就ok(%爆大佬) 离散化之后,用一个数组记录一下,直接树状数组做 吐槽:妈耶...一开始不 ...

  2. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash

    传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...

  3. bzoj 2124 等差子序列 树状数组维护hash+回文串

    等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1919  Solved: 713[Submit][Status][Discuss] Desc ...

  4. 【BZOJ2124】等差子序列 树状数组维护hash值

    [BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...

  5. Maximum Subsequence Sum【最大连续子序列+树状数组解决】

    Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i < ...

  6. BZOJ 3173 最长上升子序列(树状数组+二分+线段树)

    给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? 由于序列是顺序插入的,所以当前插入的数字对之 ...

  7. hdu 5773 The All-purpose Zero 最长上升子序列+树状数组

    题目链接:hdu 5773 The All-purpose Zero 官方题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的. 因此我们可以把0拿出来,对剩下的做O(nl ...

  8. bzoj3173: [Tjoi2013]最长上升子序列(树状数组+二分倒推)

    3173: [Tjoi2013]最长上升子序列 题目:传送门 题解:  好题! 怎么说吧...是应该扇死自己...看错了两次题: 每次加一个数的时候,如果当前位置有数了,是要加到那个数的前面,而不是直 ...

  9. 洛谷p1637 三元上升子序列(树状数组

    题目描述 Erwin最近对一种叫"thair"的东西巨感兴趣... 在含有n个整数的序列a1,a2......an中, 三个数被称作"thair"当且仅当i&l ...

随机推荐

  1. 20155327《Java程序设计》第二周学习总结

    <Java程序设计>第二学习总结 教材学习内容总结 类型 byte(字节) shot(短整型) int(整型) long(长整型) float(浮点型) double(双精度) char( ...

  2. 20155334 2016-2017-2《Java程序设计》课程总结

    20155334 2016-2017-2<Java程序设计>课程总结 1. 每周作业链接汇总 题目 主要内容 二维码 预备作业1 不知道所以然的第一次博客 预备作业2 有关之前的C语言的调 ...

  3. sougoupinyin for linux 安装步骤(精简版)

    download deb double-click to install select fcitx reboot click it in the bar and choose the"tex ...

  4. angularJS ng-repeat中的directive 动态加载template

    有个需求,想实现一个html组件,传入不同的typeId,渲染出不同的表单元素. <div ng-repeat="field in vm.data"> <magi ...

  5. Entity Framework中执行Sql语句

           如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本).        EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...

  6. python-全栈开发-前方高能-内置函数

    python_day_14 13. 前方高能-内置函数 ⼀. 本节主要内容: 1. 内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. ...

  7. C# 如何使用 RabbitMQ 实现消息收发

    本文是基于http://www.cnblogs.com/cheng-lei/articles/7274513.html的项目结构进行搭建的,了解之前请先阅读http://www.cnblogs.com ...

  8. HTTP协议请求信息详解

    通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.客户端向服务器发送一个请求,请求头包含请求的方法.URI.协议版本.以及包含请求修饰符.客户信息和内容的类似于MIME的消息结构 ...

  9. 从零开始的Python学习Episode 7——文件基本操作

    文件基本操作 一.打开文件 f = open('11','r')#open('file path','mode') 创建一个文件对象 文件有多种打开模式: 1. 'r':新建一个文件对象以只读方式打开 ...

  10. linux云主机小技巧

    微信服务器安装 安装库 python 3.5环境下 pip安装web.py时 会报错 "no module named "utils" 等问题 更换命令为“pip ins ...