「 HDOJ P2227 」 Find the nondecreasing subsequences
# 题目大意
就是找不下降子序列的个数。
# 解题思路
一开始想着先离散化,然后再做个 $dp$,发现用 $dp$ 的话时间复杂度是 $\text{O}(n^2)$ 的,稳稳超时。
这里说说 $dp$:
设 $dp[i]$ 表示以 $a[i]$ 为结尾的不下降子序列的个数。
那么状态转移方程就显而易见了:
$$dp[i] = sum(dp[j])+1,a[j]<=a[i]\&\&j<i$$
遂放弃 $dp$,转向另一种思路:树状数组。
因为要求逆序列的个数。所以选择用树状数组来做,思路如下:
将数据离散化后,按照原来输入的顺序从小到大将每一个数的影响加到树状数组中。那么影响是啥?
就是会对当前这个数后面的比它大的数字造成影响,因为会构成逆序列。然后你就牛逼了。。。
这样的话,每次询问一个数时,只有它前面的数的影响才被加了进去。就可以保证询问的正确性。
# 附上代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1e5+, HA = 1e9+;
int n, s[maxn], a[maxn], tmp[maxn], bit[maxn], NI[maxn];
inline int lowbit(int x) {return x & -x;}
inline void add(int pos, int num) {
while (pos <= n) {
bit[pos] = ((num % HA) + (bit[pos] % HA)) % HA;
pos += lowbit(pos);
}
}
inline int query(int pos) {
int res = ;
while (pos >= ) {
res = ((bit[pos] % HA) + (res % HA)) % HA;
pos -= lowbit(pos);
}
return res;
}
int main() {
while (~scanf("%d", &n)) {
memset(NI, , sizeof(NI));
memset(bit, , sizeof(bit));
for(int i=; i<=n; i++) {
scanf("%d", &s[i]);
tmp[i] = s[i];
}
sort(tmp+, tmp++n);
for(int i=; i<=n; i++)
a[i] = lower_bound(tmp+, tmp++n, s[i])-tmp;
for(int i=; i<=n; i++) {
NI[i] = query(a[i]);
NI[i] %= HA;
add(a[i], NI[i] + );
}
printf("%d\n", query(n));
}
}
「 HDOJ P2227 」 Find the nondecreasing subsequences的更多相关文章
- 「 HDOJ P3887 」 Counting Offspring
翻译 题目描述 给你一棵树,和它的树根 $P$,并且节点从 $1\rightarrow n$ 编号,现在定义 $f(i)$ 为 $i$ 的子树中,节点编号小于 $i$ 的节点的个数. 输入格式 有多组 ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
- HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences ...
- fir.im Weekly - 如何打造 Github 「爆款」开源项目
最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...
- 更新日志 - fir.im「高级统计」功能上线
距离 2016 年到来只剩 10 个日夜,fir.im 也准备了一些新鲜的东西,比如「高级统计」功能和「跳转应用商店」功能,帮助你更好地管理.优化应用,欢迎大家试用反馈:) 新增高级统计功能 这次更新 ...
- Notepad++ 开启「切分窗口」同时检视、比对两份文件
Notepad++ 是个相当好用的免费纯文本编辑器,除了内建的功能相当多之外,也支持外挂模块的方式扩充各方面的应用.以前我都用 UltraEdit 跟 Emeditor,后来都改用免费的 Notepa ...
- 「zigbee - 1」工欲善其事必先利其器 - IAR for 8051 IDE customization
最近在实验室做一些 Zigbee 相关的事情,然而一直没在博客上记录啥东西,也不像原来在公司有动力在 Confluence wiki 上扯东扯西.直到前些阵子,跑到 feibit 论坛上(国内较大的一 ...
- 「C语言」文件的概念与简单数据流的读写函数
写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...
- 「C语言」Windows+EclipseCDT下的C语言开发环境准备
之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...
随机推荐
- E20180403-hm
accompany vt. 陪伴,陪同; 附加,补充; 与…共存; 为…伴奏 synchronous adj. 同时存在[发生]的,同步的 asynchronous adj. 异步的; particu ...
- poj2239 poj1274【二分匹配】
题意: 就是尽可能的选多的课 思路: 把课程和上课的时间看作二分图 跑一跑二分匹配就好了 #include<iostream> #include<cstdio> #includ ...
- python 字典 dict items values keys
dict.items() 1 >>> d = dict(one=1,two=2) 2 >>> it1 = d.items() 3 >>> it1 ...
- [Swift]有用的Binary Heap Type类
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 【POJ - 3190 】Stall Reservations(贪心+优先队列)
Stall Reservations 原文是English,这里直接上中文吧 Descriptions: 这里有N只 (1 <= N <= 50,000) 挑剔的奶牛! 他们如此挑剔以致于 ...
- wamp2.5版本配置多端口虚拟主机
1.保证httpd.conf下 LoadModule php5_module "D:/E/php/wamp/bin/php/php5.5.12/php5apache2_4.dll" ...
- 即时编译(JIT)
即时编译(JIT : just-in-time compilation): 指计算机领域里,即时编译也被成为动态翻译,是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术 即时编译 ...
- 在服务器上执行hbase的jar包
hadoop命令执行hbase应用jar包时的环境变量加载问题 Apache HBase ™ Reference Guide HBase, MapReduce, and the CLASSPATH
- qconshanghai2015
http://2015.qconshanghai.com/schedule 大会日程 2015年10月15日 星期四 08:30 开场致辞 地点 光大宴会厅 专题 主题演讲 数据分析与移动开发工具 ...
- 通用mapper的generator
<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-genera ...