hdu5489 树状数组+dp
2015-10-06 21:49:54
这题说的是个给了一个数组,然后删除任意起点的一个连续的L个数,然后求最长递增子序列《是递增,不是非递减》,用一个树状数组维护一下就ok了
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=;
int A[maxn],B[maxn];
int dp[maxn][];
int NUM[maxn][],N;
int lowbit(int x)
{
return x&(-x);
}
void add(int loc, int v,int op)
{
while(loc<=N)
{
NUM[loc][op]=max(v,NUM[loc][op]);
loc+=lowbit(loc);
}
}
int sum(int loc, int op)
{
int ans=;
while(loc>)
{
ans=max(ans,NUM[loc][op]);
loc-=lowbit(loc);
}
return ans;
}
int main()
{
int cas;
scanf("%d",&cas);
for(int cc=; cc<=cas; cc++)
{
int n,L;
scanf("%d%d",&n,&L); int id=;
for(int i=; i<n; i++)
{
scanf("%d",&A[i]);
B[i]=A[i];
if(A[i]<A[id])id=i;
}
if(L==n){
printf("Case #%d: %d\n",cc,);continue;
}
B[n]=A[id]-;
sort(B,B+(n+));
N=unique(B,B+(n+))-B;
memset(NUM,,sizeof(NUM));
for(int i=; i<n; i++){
A[i]=lower_bound(B,B+N,A[i])-B+;
}
int ans=;
for(int i=; i<n; i++)
{
dp[i][]=dp[i][]=;
int Loc=A[i];
int AA=sum(Loc-,);
dp[i][]=AA+;
AA=sum(Loc-,);
dp[i][]=max(dp[i][],AA+);
if(n-L>i){
dp[i][]=sum(Loc-,)+;
}
if(i-L>=){
add(A[i-L],dp[i-L][],);
}
if(i>=L){
add(A[i],dp[i][],);
}
if(n-L>i){
add(A[i],dp[i][],);
}
ans=max(max(dp[i][],dp[i][]),ans);
}
printf("Case #%d: %d\n",cc,ans);
}
return ;
}
hdu5489 树状数组+dp的更多相关文章
- codeforces 597C (树状数组+DP)
题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][k ...
- hdu 4622 Reincarnation trie树+树状数组/dp
题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...
- Codeforces 597C. Subsequences (树状数组+dp)
题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...
- HDU2227Find the nondecreasing subsequences(树状数组+DP)
题目大意就是说帮你给出一个序列a,让你求出它的非递减序列有多少个. 设dp[i]表示以a[i]结尾的非递减子序列的个数,由题意我们可以写出状态转移方程: dp[i] = sum{dp[j] | 1&l ...
- CodeForces - 314C Sereja and Subsequences (树状数组+dp)
Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a pie ...
- HDU 6348 序列计数 (树状数组 + DP)
序列计数 Time Limit: 4500/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- [Codeforces261D]Maxim and Increasing Subsequence——树状数组+DP
题目链接: Codeforces261D 题目大意:$k$次询问,每次给出一个长度为$n$的序列$b$及$b$中的最大值$maxb$,构造出序列$a$为$t$个序列$b$连接而成,求$a$的最长上升子 ...
- 【XSY2727】Remove Dilworth定理 堆 树状数组 DP
题目描述 一个二维平面上有\(n\)个梯形,满足: 所有梯形的下底边在直线\(y=0\)上. 所有梯形的上底边在直线\(y=1\)上. 没有两个点的坐标相同. 你一次可以选择任意多个梯形,必须满足这些 ...
- hdu5125 树状数组+dp
hdu5125 他说的是n个人每个人都有两个气球a,b,气球各自都有相应的体积,现在让他们按照序号排列好来,对他们的a气球体积值计算最长上升子序列,对于这整个排列来说有m次机会让你将a气球替换成b气 ...
随机推荐
- oracle查表技巧
查每张表中有多少条记录 SELECT table_name,num_rows FROM user_tables order by num_rows desc; https://www.cnblogs. ...
- day5_函数_判断小数
def check_float(s): ''' #这个函数的作用就是判断传入的字符串是否是合法的消失 :param s: 传入一个字符串 :return: True/False ''' s = str ...
- webpack打包配置模板
/** * Created by zzq on 2017/3/26. *///__dirname是node.js中的一个全局变量,它指向当前执行脚本所在的目录module.exports = {//注 ...
- wait()函数的详细分析
之前一直没太深入的去理解wait()函数,今天机缘巧合之前又看了看,发现之前没有真正的理解该函数. 众所周知,wait()函数一般用在父进程中等待回收子进程的资源,而防止僵尸进程的产生. (In UN ...
- Python 字符串常用方法总结
明确:对字符串的操作方法都不会改变原来字符串的值 1,去掉空格和特殊符号 name.strip() 去掉空格和换行符 name.strip('xx') 去掉某个字符串 name.lstrip() ...
- HTTP协议属于应用层,而SOCKS协议属于传输层
HTTP协议属于应用层,而SOCKS协议属于传输层 SOCKS代理 SOCKS代理能在任何端口,任何协议下运行. SOCKS V4只支持 TCP连接,而SOCKS V5在其基础上增加了安全认证以及对U ...
- rem : web app适配的秘密武器
css html { font-size: calc(100vw / 3.75) } jsdocument.documentElement.style.fontSize = $(document.do ...
- 【剑指offer】两个链表的第一个公共结点
一.题目: 输入两个链表,找出它们的第一个公共结点. 二.思路: 思路一:模拟数组,进行两次遍历,时间复杂度O(n2) 思路二:假定 List1长度: a+n List2 长度:b+n, 且 a&l ...
- vue-watch监听路由的变化
- Centos7 下 yum -y install ntp 出现/var/run/yum.pid 已被锁定
[root@localhost ~ ]# yum -y install ntp已加载插件:fastestmirror, langpacksRepodata is over 2 weeks old. I ...