The All-purpose Zero

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5773

Description

?? gets an sequence S with n intergers(0 < n <= 100000,0<= S[i] <= 1000000).?? has a magic so that he can change 0 to any interger(He does not need to change all 0 to the same interger).?? wants you to help him to find out the length of the longest increasing (strictly) subsequence he can get.

Input

The first line contains an interger T,denoting the number of the test cases.(T <= 10)

For each case,the first line contains an interger n,which is the length of the array s.

The next line contains n intergers separated by a single space, denote each number in S.

Output

For each test case, output one line containing “Case #x: y”(without quotes), where x is the test case number(starting from 1) and y is the length of the longest increasing subsequence he can get.

Sample Input

2

7

2 0 2 1 2 0 5

6

1 2 3 3 0 0

Sample Output

Case #1: 5

Case #2: 5

Hint

In the first case,you can change the second 0 to 3.So the longest increasing subsequence is 0 1 2 3 5.

Hint

题意

给你n个数,其中0可以变成任何数,问你最长上升子序列可以是多少

题解:

考虑dp[i]表示长度为i的lis的最后一个数是多少。

遇到0的时候,就相当于dp[i]原来等于v,现在dp[i+1]=v+1了,这样的转移。

其实就相当于整体向右平移。

这个我们就在线段树上预先留很多个位置,让起点向左边平移就好了嘛,嘿嘿嘿。

代码

#include <bits/stdc++.h>
#define rep(a,b,c) for(int (a)=(b);(a)<=(c);++(a))
#define drep(a,b,c) for(int (a)=(b);(a)>=(c);--(a))
#define pb push_back
#define mp make_pair
#define sf scanf
#define pf printf
#define two(x) (1<<(x))
#define clr(x,y) memset((x),(y),sizeof((x)))
#define dbg(x) cout << #x << "=" << x << endl;
const int mod = 1e9 + 7;
int mul(int x,int y){return 1LL*x*y%mod;}
int qpow(int x , int y){int res=1;while(y){if(y&1) res=mul(res,x) ; y>>=1 ; x=mul(x,x);} return res;}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
using namespace std;
const int maxn = 1e5 + 15;
const int inf = 0x3f3f3f3f;
int a[maxn],len[maxn],N,tot,C,Midpoint; struct Sgtree{
struct node{
int l , r , maxv , lazy; void Update( int x ){
lazy += x;
maxv += x;
}
}tree[maxn << 3]; void ReleaseLabel( int o ){
if( tree[o].lazy ){
tree[o << 1].Update( tree[o].lazy );
tree[o << 1 | 1].Update( tree[o].lazy );
tree[o].lazy = 0 ;
}
} void Maintain( int o ){
tree[o].maxv = max( tree[o << 1].maxv , tree[o << 1 | 1 ].maxv );
} void Build(int l , int r , int o){
tree[o].l = l , tree[o].r = r , tree[o].maxv = inf , tree[o].lazy = 0;
if( r > l ){
int mid = l + r >> 1;
Build( l , mid , o << 1 );
Build( mid + 1 , r , o << 1 | 1 );
Maintain( o );
}else if( l <= Midpoint ) tree[o].maxv = -5*N - 5;
} void Modify( int ql , int qr , int v , int o ){
int l = tree[o].l , r = tree[o].r;
if( ql <= l && r <= qr ) tree[o].Update( v );
else{
int mid = l + r >> 1;
ReleaseLabel( o );
if( ql <= mid ) Modify( ql , qr , v , o << 1 );
if( qr > mid ) Modify( ql , qr , v , o << 1 | 1 );
Maintain( o );
}
} void Change( int x , int v , int o ){
int l = tree[o].l , r = tree[o].r;
if( l == r ) tree[o].maxv = min( tree[o].maxv , v );
else{
int mid = l + r >> 1;
ReleaseLabel( o );
if( x <= mid ) Change( x, v , o << 1 );
else Change( x, v , o << 1 | 1 );
Maintain( o );
}
} void Search( int v , int o ){
int l = tree[o].l , r = tree[o].r;
if( l == r ) tree[o].maxv = min( tree[o].maxv , v );
else{
int mid = l + r >> 1;
ReleaseLabel( o );
if( tree[o << 1].maxv >= v ) Search( v , o << 1 );
else Search( v , o << 1 | 1 );
Maintain( o );
}
} int Ask( int x , int o ){
int l = tree[o].l , r = tree[o].r;
if( l == r ) return tree[o].maxv;
else{
int mid = l + r >> 1;
ReleaseLabel( o );
int v;
if( x <= mid ) v = Ask( x , o << 1 );
else v = Ask( x , o << 1 | 1 );
Maintain( o );
return v;
}
} }Sgtree; void solve( int cas ){
Midpoint = N + 5;
Sgtree.Build( 1 , N * 2 + 500 , 1 );
int extra = 0;
rep(i,1,N){
int x = a[i];
if( x == 0 ){
++ Sgtree.tree[1].lazy; // 右移一位
Sgtree.Change( -- Midpoint , -5*N - 5 , 1 );
++ extra;
//cout << "i is " << i << endl;
//rep(j,0,N+extra-1) pf("len[%d] is %d\n" , j , Sgtree.Ask(Midpoint+j,1));
//cout << "---------" << endl;
}else Sgtree.Search( x , 1 );
}
int mx = 0;
rep(i,0,N+extra-1) if( Sgtree.Ask( Midpoint + i , 1 ) <= 10000000 ) mx = max( mx , i );
pf("Case #%d: %d\n",cas,mx);
} int main(int argc,char *argv[]){
int T=read(),cas=0;
while(T--){
N=read();
rep(i,1,N) a[i] = read();
solve( ++ cas );
}
return 0;
}

hdu 5773 The All-purpose Zero 线段树 dp的更多相关文章

  1. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  2. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  3. HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模

    Multiply game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

  5. Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)

    [题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...

  6. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  7. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  9. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  10. hdu 1255 覆盖的面积(线段树 面积 交) (待整理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.   In ...

随机推荐

  1. Brief History of Machine Learning

    Brief History of Machine Learning My subjective ML timeline Since the initial standpoint of science, ...

  2. centos 7 两台机器搭建三主三从 redis 集群

    参考自:https://linux.cn/article-6719-1.htmlhttp://blog.csdn.net/xu470438000/article/details/42971091 ## ...

  3. [转载]HTML5浏览器测试网站汇总

    http://www.cnblogs.com/javawebsoa/archive/2012/04/19/2458224.html 浏览器支持情况统计 When Can IUse:图表经常更新,展示了 ...

  4. python 的print和特殊方法 __str__和__repr__

    先提出一个疑问,为什么print函数可以直接打印参数呢?即使是数字?例如print 1,就会打印1.我们知道1的类型是整型(题外话,在python中1是常量,也是类int的对象,而java中1只是常量 ...

  5. 云计算--hbase shell

    具体的 HBase Shell 命令如下表 1.1-1 所示: 下面我们将以“一个学生成绩表”的例子来详细介绍常用的 HBase 命令及其使用方法. 这里 grad 对于表来说是一个列,course ...

  6. git学习——Git 基础要点【转】

    转自:http://blog.csdn.net/zeroboundary/article/details/10549555 简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是 ...

  7. Android 常用动画之RotateAnimation

    前两天接到任务做一个UI,有用到动画,于是抽空看了下Android动画相关知识. Android Animation共有四大类型,分别是 Alpha      透明度动画 Scale      大小伸 ...

  8. ssh隐藏的sftp功能的使用

    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...

  9. Intellij IDEA15: 带着参数 运行

    package main.scala /** * Created by silentwolf on 2016/5/24. */ object FileIO { def main(args: Array ...

  10. .NetCore 使用Zipkin 分布式服务追踪监控服务性能

    参考资料 https://zipkin.io/ https://github.com/openzipkin/zipkin/ https://github.com/openzipkin/zipkin4n ...