hdu4991 树状数组+dp】的更多相关文章

这题说的是给了一个序列长度为n 然后求这个序列的严格递增序列长度是m的方案有多少种,如果用dp做那么对于状态有dp[n][m]=dp[10000][100],时间复杂度为n*m*n接受不了那么想想是否可以再这个上加些什么样的优化.树状数组 对于每个值离散在树状数组中然后对于每个点都有以他为结尾点的递增序列的长度为1..100,那么他的状态是怎么来的呢?当他的i长度的是等于在他前面比他来的小的 长度为i-1的的种数,然后得到了这个值将他在加进这第i棵树状数组中然后就得到解了,不断地进行这个过程时间…
题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][k](1<=k<j),由于要求前缀和,可以用树状数组优化 #include<bits/stdc++.h> #define lowbit(x) x&(-x) typedef long long ll; const int N=1e5+3; ll dp[12][N]; using n…
题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路(虎哥):用字典树把每一个字符串对应成一个整数 相同的字符串对应到相同的整数上 把所用的串对应的整数放在一个数组里 比如书字符串s[l...r]对应的整数是 k 那么二维数组 [l][r] 就等于k 假设一个对应好的二维数组  左下角是原点 3     4     5     2 2     3  …
题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长度为j的上升子序列个数,但是dp数组是在树状数组的update函数中进行更新. update(i, val, j)函数表示在i的位置加上val,更新dp[i][j]. sum(i, j)就是求出末尾数字小于等于i 且长度为j的子序列有多少个. //#pragma comment(linker, "/…
题目大意就是说帮你给出一个序列a,让你求出它的非递减序列有多少个. 设dp[i]表示以a[i]结尾的非递减子序列的个数,由题意我们可以写出状态转移方程: dp[i] = sum{dp[j] | 1<=j<i && a[j] <= a[i]} + 1. 这样一来这里面所有的dp[]值的和就是最后的结果. 但是这个状态转移方程很明显复杂度是O(n^2),但是n可以达到100000,很明显会超时.既然是求前导和,很明显我们就应该可以想到用树状数组(虽然我怎么也不可能想到==!)…
Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a piece of squared paper and wrote all distinct non-empty non-decreasing subsequences of sequence a. Then for each sequence written on the squared paper, S…
序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 348    Accepted Submission(s): 117 Problem Description 度度熊了解到,1,2,…,n 的排列一共有 n!=n×(n−1)×⋯×1 个.现在度度熊从所有排列中等概率随机选出一个排列 p1,p2,…,pn,你需要对 k=1,2,…
题目链接: Codeforces261D 题目大意:$k$次询问,每次给出一个长度为$n$的序列$b$及$b$中的最大值$maxb$,构造出序列$a$为$t$个序列$b$连接而成,求$a$的最长上升子序列.$n,maxb\le10^5,maxb*n\le2*10^7,t\le10^9$. 设$b$中不同数的个数为$sum$.如果$sum\le t$,那么答案就是$sum$(只需要从第$i$个序列$b$中取第$i$小的数即可).现在只需要考虑$t<sum$的情况,因为$sum\le maxb$,所…
题目描述 一个二维平面上有\(n\)个梯形,满足: 所有梯形的下底边在直线\(y=0\)上. 所有梯形的上底边在直线\(y=1\)上. 没有两个点的坐标相同. 你一次可以选择任意多个梯形,必须满足这些梯形两两重叠,然后删掉这些梯形. 问你最少几次可以删掉所有梯形. \(n\leq {10}^5\) 题解 先把坐标离散化. 定义\(A\)为所有梯形组成的集合. 我们定义\(A\)上的严格偏序:两个梯形\(a<b\)当且仅当\(a\)与\(b\)不重叠且\(a\)在\(b\)的左边. 那么每次删掉的…
2015-10-06 21:49:54 这题说的是个给了一个数组,然后删除任意起点的一个连续的L个数,然后求最长递增子序列<是递增,不是非递减>,用一个树状数组维护一下就ok了 #include <iostream> #include <algorithm> #include <string.h> #include <cstdio> #include <cmath> using namespace std; ; int A[maxn]…