HDU5773 The All-purpose Zero
来源:互联网 发布:蒲公英淘客软件 编辑:程序博客网 时间:2024/06/05 09:14
HDU5773 The All-purpose Zero
- HDU5773 The All-purpose Zero
- 题意
- 题解
- 代码
题意
- HDU5773多校训练2016第四场1010题
- 求一串数的LIS,0可以变为任意数
题解
多校第四轮,引用自官方解答
0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的。因此我们可以把0拿出来,对剩下的做O(nlogn)的LIS,统计结果的时候再算上0的数量。为了保证严格递增,我们可以将每个权值S[i]减去i前面0的个数,再做LIS,就能保证结果是严格递增的。
刚好复习LIS的O(nlogn)求法,本质上就是,维护当前最长序列,当新数比末尾数更大,加入序列末尾,序列增长,如果小于,那么更新序列中可插入位置的数,保证后续能取得更优解。
例如:
12**4**5
->12**3**5
代码
#include <cstdio> #define MAX 100000#define INF 1000000int a[MAX], c[MAX], len;int find(int L,int R,int x){ if(L==R) return L; int mid=(L+R)>>1; if(c[mid]<x) return find(mid+1,len,x); else return find(L,mid,x);}int main(){ int i,cas,n,t,m,T,b,k,ans,j,max,zero; scanf("%d",&T); for(cas=1;cas<=T;++cas) { scanf("%d",&n); zero=0; for(i=0,m=0;i<n;i++) { scanf("%d",&a[i]); if(a[i] == 0) ++zero; else a[m++] = a[i] - zero; } len=0; c[0]=-INF; for(i=0;i<m;i++) { if(a[i]>c[len]) j=++len; else j=find(1,len,a[i]); c[j]=a[i]; } printf("Case #%d: %d\n", cas,len+zero); }}
0 0
- hdu5773 The All-purpose Zero
- HDU5773 The All-purpose Zero
- HDU5773:The All-purpose Zero
- The All-purpose Zero-HDU5773
- The All-purpose Zero||HDU5773
- hdu5773 The All-purpose Zero(DP)
- hdu5773-LIS&技巧-The All-purpose Zero
- hdu5773 The All-purpose Zero(LIS变形)
- HDU5773(The All-purpose Zero LIS变形)
- (2016多校联赛)HDU5773 The All-purpose Zero
- hdu5773 The All-purpose Zero 贪心+最长上升子序列
- HDU5773 The All-purpose Zero(LIS变形)
- The All-purpose Zero
- The All-purpose Zero
- The All-purpose Zero
- The All-purpose Zero
- 2016多校训练Contest4: 1010 The All-purpose Zero hdu5773
- (多校第四场1010)HDU5773 The All-purpose Zero(LIS)
- 字符串翻转和旋转问题和例题
- 数组中只出现一次的数字 C++
- 策略模式(Strategy Pattern)
- DP问题各种模型的状态转移方程
- 从while(scanf() != EOF)说到ACM OnlineJuge的评判原理
- HDU5773 The All-purpose Zero
- 二叉查找树(二叉排序树)BST解析
- [完全背包]Tyvj1199 邮票问题
- 找出字符串中连续出现次数最多的子串
- Command设计模式和java回调机制的异同
- SQL 行转列的一些思考
- 如何快速低成本搭建 DA14580/DA1458x 软硬件开发平台open-ble.org
- Quartz-JobDetail和Trigger-Job
- QFile