hdu 5773 The All-purpose Zero 线段树 dp
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的更多相关文章
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模
Multiply game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 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 ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
随机推荐
- Java入门系列(七)Java 集合框架(JCF, Java Collections Framework)
Java 集合概述 List.Set.Map可以看做集合的三大类 java集合就像一个容器,可以将多个对象的引用丢进该容器中. Collection和Map是java集合的根接口. List List ...
- Xcode多种Build Configuration配置使用
Build Configuration? Xcode默认会有2个编译模式,一个是Debug,一个是Release.Release下不能调试程序,编译时有做编译优化,会比用Debug打包出来的运行快,另 ...
- C 语言结构体之点运算符( . )和箭头运算符( -> )的区别
很多时候,在对结构体进行相应的编码时,时而发现是用点运算符( . ),时而是用箭头运算符( -> ):那么这两者之间的使用有什么区别么? 相同点:两者都是二元操作符,而且右边的操作数都是成员的名 ...
- MongoDB 之 Array Object 的特殊操作 MongoDB - 6
相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...
- Wireshark按照域名过滤
HTTP协议 http.host == "http://baidu.net" DNS协议 dns.qry.name=="www.baidu.com"
- VCForPython27.msi安装后, 还显示error: Unable to find vcvarsall.bat
C:\Users\zpc\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC 增加环境变量: SET VCPYTH ...
- Eureka的自我保护模式
一 Eureka的自我保护模式 进入自我保护模式最直观的体现就是Eureka Server首页的警告,如下图: 默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,E ...
- 排序算法的JS实现
排序算法是基础算法,虽然关键在于算法的思想而不是语言,但还是决定借助算法可视化工具结合自己常用的语言实现一下 1.冒泡排序 基本思路:依次比较两两相邻的两个数,前面数比后面数小,不变.前面数比后面数大 ...
- laravel 批量更新
/** * 转发动态和资讯数量统计 */ public function forwardCounts(FeedModel $feedModel) { //统计动态转发的id $feeds=$feedM ...
- MySQL锁分类
相对其他数据库而言,MySQL的锁机制比较简单,基最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB ...