BZOJ3173: [Tjoi2013]最长上升子序列
2017-02-11 11:22
274 查看
我们可以倒着处理输入处理出最终的序列,然后因为插入是从1~n插入的,所以按顺序插入,可以直接用树状数组找插入位置之前的每个已插入的位置答案的最大值,然后更新一下
#include<set> #include<map> #include<deque> #include<queue> #include<stack> #include<cmath> #include<ctime> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<climits> #include<complex> #include<iostream> #include<algorithm> #define ll long long #define lowbit(x) x&(-x) using namespace std; void up(int &x,int y){if(x<y)x=y;} void down(int &x,int y){if(x>y)x=y;} const int maxn = 110000; int n,sc[maxn]; int tr[maxn<<2]; void build_(int x,int l,int r) { tr[x]=(r-l+1); if(l==r) return ; int mid=(l+r)>>1; build_(x<<1,l,mid); build_((x<<1)|1,mid+1,r); } int upd(int x,int l,int r,int k) { tr[x]--; if(l==r) return l; int mid=(l+r)>>1,lc=x<<1,rc=lc|1; if(k<=tr[lc]) return upd(lc,l,mid,k); else return upd(rc,mid+1,r,k-tr[lc]); } int a[maxn],ans[maxn]; int t[maxn]; void mx(int x,int tx) { for(int i=x;i<=n;i+=lowbit(i)) up(t[i],tx); } int query(int x) { int r=0; for(;x;x-=lowbit(x)) up(r,t[x]); return r; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&sc[i]); build_(1,1,n); for(int i=n;i>=1;i--) { int tmp=upd(1,1,n,sc[i]+1); a[tmp]=i; } for(int i=1;i<=n;i++) { int tmp=query(a[i])+1; mx(a[i],tmp); ans[a[i]]=tmp; } for(int i=2;i<=n;i++) up(ans[i],ans[i-1]); for(int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- bzoj3173【TJOI2013】最长上升子序列
- BZOJ3173 [Tjoi2013]最长上升子序列
- bzoj3173: [Tjoi2013]最长上升子序列
- bzoj3173: [Tjoi2013]最长上升子序列(fhqtreap)
- BZOJ3173: [Tjoi2013]最长上升子序列 Treap 平衡树
- BZOJ 3173: [Tjoi2013]最长上升子序列
- [树状数组求第K大][BZOJ 3173][TJOI 2013]最长上升子序列
- BZOJ3173 [Tjoi2013]最长上升子序列(离线处理+Treap+LIS)
- [Treap] [LIS] BZOJ[3173] [Tjoi2013]最长上升子序列
- bzoj3173 [Tjoi2013]最长上升子序列
- 3173: [Tjoi2013]最长上升子序列
- 3173: [Tjoi2013]最长上升子序列
- BZOJ3173:[TJOI2013]最长上升子序列 & HDU3564:Another LIS——题解
- 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)
- BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)
- 【bzoj3173】[Tjoi2013]最长上升子序列
- BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)
- bzoj3173: [Tjoi2013]最长上升子序列
- bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)
- BZOJ 3173: [Tjoi2013]最长上升子序列