codeforces Longest Increasing Subsequence
2016-03-08 14:28
375 查看
Longest Increasing Subsequence
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<stdio.h> #include<algorithm> #include<cmath> #include<map> #include<queue> #include<bitset> #include<stack> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define inf 0x3f3f3f3f #define eps 1e-9 #define pii pair<int,int> #define MP make_pair #define LL long long #define ULL unsigned long long #define N ( 200000 + 10 ) #define M ( 200000 + 10) #define mod 1000000007 int c , sz; int a , b ; int s ; int len , cid , pre ; bool cmp(int a, int b) { return a > b; } int findy(int rr, int v) { int l = 1, r = rr; while(l < r) { int mid =( l + r>>1) + 1; if(b[mid] <= v) l = mid; else r = mid-1; } return l; } int main (){ int n, m; scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); a[0] = -inf, a[++n] = inf; for(int i = 1 ; i <= n; ++i) { if(a[i] == -1) ++s[i]; s[i] += s[i-1]; } scanf("%d", &m); for(int i = 1; i <= m; ++i) scanf("%d", &b[i]); for(int i = 0; i <= n; ++i) c[i] = inf; sort(b+1, b + m + 1); sz = 0; for(int i = 0; i <= n; ++i) { if(a[i] == -1) { int kk = sz-1; pre[i] = -1; len[i] = -1; for(int j = m; j >= 1; --j) { while(kk >= 0 && c[kk] >= b[j]) --kk; int k = kk+1; if(k == sz) c[sz++] = b[j]; else { c[k] = b[j]; } cid[k] = -1; } } else { int k = lower_bound(c, c + sz, a[i]) - c; if(k == sz) c[sz++] = a[i]; else c[k] = a[i]; cid[k] = i; len[i] = k; pre[i] = cid[k-1]; } } m = unique(b+1, b+m+1) - b - 1; //for(int i = 0; i <= n; ++i) // printf("len %d pre %d\n", len[i], pre[i]); for(int i = n, rest = m; i > 0 && rest > 0;) if(a[i] != -1) { if(pre[i] != -1) { i = pre[i]; continue; } int y = findy(rest, a[i]-1); // printf(" yy %d\n", y); for(int j = i-1; j >= 0; -- j) if(a[j] != -1 && a[j] < a[i]) { int x = lower_bound(b+1, b+rest+1, a[j]+1) - b ; if(len[i] - len[j] - 1 == min(y-x+1, s[i] - s[j])) { for(int k = j, t = x; k <= i && t <= y; ++k) if(a[k] == -1) a[k] = b[t], b[t++] = -1; i = j; rest = x - 1; break; } } } for(int i = 1, j = 1; i < n; ++i) if(a[i] == -1) { while(b[j] == -1) ++j; a[i] = b[j++]; } for(int i = 1 ;i < n; ++i) printf("%d%c", a[i], i == n-1 ? '\n': ' '); }
相关文章推荐
- UESTC--1252--24点游戏(dfs)
- 10029---关于EL表达式中requestScope和param区别
- UESTC--1252--24点游戏(dfs)
- Version & Build & CFBundleShortVersionString & CFBundleVersion
- PHP之include/require深入了解
- UITableView回调和table相关成员方法详解
- CALayer和UIView
- Handler,Looper,MessageQueue(Message)
- [custom UI series]android 自动排布的标签布局
- RoboGuice 3.0 (二)进阶篇
- SGI STL (4) :: String Implementation Issue
- 深入理解SetUID
- Selenium中expected_conditions下text_to_be_present_in_element_value方法的使用
- Your build settings specify a provisioning profile with the UUID, no provisioning profile ...问题的解决办法
- JEasyUI: Bug Fixing for perpertygrid
- 在vs中开发TypeScript,使用Require,import,export的实现
- BlueStacks不仅支持x86和ARM处理器,新版BlueStacks并不是单纯的实现虚拟化,而是运行整个Android系统
- iOS画图-UIBezierPath和CAShapeLayer的简单使用
- leetcode--Range Sum Query - Immutable
- android开发系列之由ContentValues看到的