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 ...
随机推荐
- Codeforces 931 C. Laboratory Work
http://codeforces.com/problemset/problem/931/C 题意: 给定一个数列,要求构造一个等长的数列,使得数列的平均值等于给定数列,并且使得构造出的数列中与原数列 ...
- 第12月第2天 uiscrollview _adjustContentOffsetIfNecessary 圆角
1. uiscrollview在调用setFrame,setBounds等方法的时候会默认调用稀有api: _adjustContentOffsetIfNecessary 这个方法会改变当前的cont ...
- G. (Zero XOR Subset)-less(线性基)
题目链接:http://codeforces.com/contest/1101/problem/G 题目大意:给你n个数,然后让你把这n个数分成尽可能多的集合,要求,每个集合的值看做这个集合所有元素的 ...
- Shell命令行中特殊字符与其转义详解(去除特殊含义)
特殊符号及其转义 大家都知道在一个shell命令是由命令名和它的参数组成的, 比如 cat testfile, 其中cat是命令名, testfile是参数. shell将参数testfile传递给c ...
- Android启动过程
1.背景知识 Init进程是Linux环境下非常重要的一个进程,而Zygote进程是J ...
- Expression Tree Build
The structure of Expression Tree is a binary tree to evaluate certain expressions.All leaves of the ...
- springcloud Eureka自我保护机制
自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行. 默认情况下,如果Eureka Serve ...
- React-Native 之 TabBarIOS
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- Java学习--编译器javac
Java的源程序为.java文件, 编译后生成.class文件(字节码文件); javac(java compiler的简写)是java语言的编译器. Hello.java public class ...
- vue.js 解决空格报错!!!
当我们初入vue.js的时候.使用cli脚手架快速创建项目的时候: 如果语法格式错误(这里主要指的是:空格多少引起的问题)!! 找到 webpack.base.config.js文件注释掉下面的东西 ...