HDU 5748 Bellovin(LIS nlogn)
2017-02-18 17:01
281 查看
坑点:
注意在二分的时候不要减一,比如:if(key < mid){ r = mid - 1; }
这样的话可能把我们需要改的数据跳过去。。。。
坑死我了。
#include <iostream> #include <cstdio> #include <string.h> #include <queue> #include <cmath> #include <algorithm> #include <map> typedef long long int lli; using namespace std; int dp[100100]; int cnt; int a[100100]; int ans[100100]; int bs(int key){ int l = 1,r = cnt; int mid = (l+r) >> 1; while(l < r && r-l > 3){ mid = (l+r) >> 1; if(dp[mid] == key){ return mid; } if(dp[mid] > key) r = mid; else l = mid; } for(int i = l;i <= r;i++){ if(dp[i] >= key){ dp[i] = key; return i; } } return 233333333333; } int main(){ int t; cin>>t; int n; while(t--){ cnt = 1; scanf("%d",&n); for(int i = 1;i <= n;i++){ scanf("%d",a+i); } dp[1] = a[1]; ans[1] = 1; for(int i = 2;i <= n;i++){ if(a[i] > dp[cnt]){ dp[++cnt] = a[i]; ans[i] = cnt; } else{ ans[i] = bs(a[i]); } } for(int i = 1;i <= n;i++){ if(i != 1) printf(" "); printf("%d",ans[i]); } puts(""); } }
相关文章推荐
- hdu-5748 Bellovin(LIS)
- HDU 5748 Bellovin (LIS)
- hdu 5748 Bellovin(LIS)
- HDU-5748-Bellovin【LIS】
- HDU - 5748 Bellovin【nlgn+LIS】
- HDU 5748 Bellovin(最长上升子序列[nlogn])
- HDU 5748 Bellovin(LIS)
- HDU 5748 Bellovin(LIS)
- HDU-5748 Bellovin 【LIS(STL应用)】
- 【HDU】5748 - Bellovin(LIS)
- 【HDU】-5748-Bellovin(LIS,变化)
- HDU 5748 (Bellovin LIS)
- Bellovin【hdu 5748 dp lis】
- hdu_5748_Bellovin(LIS)
- 【HDU】5141 LIS again 在普通nlogn求LIS的基础上稍作修改
- hdu 5748(LIS)
- HDU - 1025(LIS-O(nlogn)) - Constructing Roads In JGShining's Kingdom
- Bellovin HDU 5748
- hdu 5748 Bellovin BestCoder #84 1002
- HDU 5748 Bellovin