hdu5773-LIS&技巧-The All-purpose Zero
2017-09-14 19:55
253 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5773
给定一个串,问你求lis。提一下,里面的0可以变成任意数。。
思路:先求一个lis。然后再加上0的个数
but,有的0是不能起作用的。。
可以让a[i]减去他前面 出现的0的个数。。。
具体看代码,梦里啥都有
给定一个串,问你求lis。提一下,里面的0可以变成任意数。。
思路:先求一个lis。然后再加上0的个数
but,有的0是不能起作用的。。
可以让a[i]减去他前面 出现的0的个数。。。
具体看代码,梦里啥都有
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+2000; int a[maxn]; int sum[maxn]; int t; /* 先 消除0的影响,然后最后求得lis再加上0的数量 (我只能说这个消除0的影响是真的强。) 比方这种形式 3 0 4 如果在最后加上0的个数,那么哥哥你就错了,因为你会发现 0 他什么也改不了,所以这个0其实是没用的。。只能这样 而这套题采取了什么套路呢。就是减去他前面0的数目。。。 这样就能保证是严格递增的。(就是我刚才说的样例?) */ int m; bool vis[maxn]; int solve(){ vector<int>s; for(int i=1;i<=m;i++){ if(vis[i]) continue; int u=lower_bound(s.begin(),s.end(),a[i])-s.begin(); if(u==s.size()){ s.push_back(a[i]); } else s[u]=a[i]; } return s.size(); } int main(){ scanf("%d",&t); for(int tt=1;tt<=t;tt++){ scanf("%d",&m); memset(vis,false,sizeof(vis)); for(int i=1;i<=m;i++) scanf("%d",&a[i]); sum[0]=0; for(int i=1;i<=m;i++){ if(!a[i]) sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]; } for(int i=1;i<=m;i++){ if(!a[i]) vis[i]=true; else a[i]-=sum[i-1]; } int ans=solve(); ans+=sum[m]; printf("Case #%d: %d\n",tt,ans); } return 0; }
相关文章推荐
- HDU:5773 The All-purpose Zero(LIS-n*logn解法+思维+技巧)
- HDU5773 The All-purpose Zero(LIS)
- hdu5773 The All-purpose Zero(LIS变形)
- HDU5773 The All-purpose Zero(LIS变形)
- The All-purpose Zero---hdu5773(LIS变形)
- (多校第四场1010)HDU5773 The All-purpose Zero(LIS)
- hdu5773--The All-purpose Zero(LIS变形)
- HDU 5773 The All-purpose Zero(LIS特殊处理)
- HDU - 5773 The All-purpose Zero(思维+LIS)
- HDU 5773 The All-purpose Zero(O(nlgn)求LIS)
- hdu5773 The All-purpose Zero 贪心+最长上升子序列
- 2016 Multi-University Training Contest 4 1010 The All-purpose Zero(变形LIS)
- hdu_5773_The All-purpose Zero(LIS)
- HDU 5773 The All-purpose Zero 求LIS
- HDU 5773 The All-purpose Zero (LIS)
- hdu5773 The All-purpose Zero
- (2016多校联赛)HDU5773 The All-purpose Zero
- HDU 5773 The All-purpose Zero(LIS)
- HDU 5773 The All-purpose Zero (LIS变形)
- hdu 5773 The All-purpose Zero 思维转化+nlogn LIS