Advertisement
royalsflush

What Goes Up - UVa 481 (Segtree)

Sep 17th, 2012
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <stack>
  5. using namespace std;
  6.  
  7. const int MAXN = 100010;
  8. int tree[4*MAXN];
  9. int n;
  10. int a[MAXN];
  11. int ord[MAXN];
  12. int dp[MAXN];
  13.  
  14. int find(int x) {
  15.     for (int beg=0, end=n-1; beg<=end; ) {
  16.         int mid=(beg+end)/2;
  17.  
  18.         if (ord[mid]==x) return mid;
  19.        
  20.         if (ord[mid]<x) beg=mid+1;
  21.         else end=mid-1;
  22.     }
  23.  
  24.     return -1;
  25. }
  26.  
  27. void update(int root, int l, int r, int pos, int val) {
  28.     if (l==r) {
  29.         tree[root]=val;
  30.         return;
  31.     }
  32.  
  33.     int mid=(l+r)/2;
  34.  
  35.     if (pos<=mid) update(2*root+1,l,mid,pos,val);
  36.     else update(2*root+2,mid+1,r,pos,val);
  37.  
  38.     tree[root]=max(tree[2*root+1],tree[2*root+2]);
  39. }
  40.  
  41. int query(int root, int l, int r, int ql, int qr) {
  42.     if (ql<=l && qr>=r)
  43.         return tree[root];
  44.  
  45.     int mid=(l+r)/2;
  46.  
  47.     int maxS=0;
  48.     if (ql<=mid) maxS=max(maxS,query(2*root+1,l,mid,ql,min(qr,mid)));
  49.     if (qr>mid) maxS=max(maxS,query(2*root+2,mid+1,r,max(ql,mid+1),qr));
  50.  
  51.     return maxS;
  52. }
  53.  
  54. int main() {
  55.     n=0;
  56.     while (scanf("%d", &a[n++])!=EOF);
  57.     memset(tree,0,sizeof(tree));   
  58.  
  59.     for (int i=0; i<n; i++)
  60.         ord[i]=a[i];
  61.     sort(ord,ord+n);
  62.  
  63.     update(0,0,n-1,find(a[0]),1);
  64.     dp[0]=1;
  65.  
  66.     for (int i=1; i<n; i++) {
  67.         int idx=find(a[i]);
  68.         int d=0;
  69.        
  70.         if (idx) d=query(0,0,n-1,0,idx-1);
  71.         d+=1;
  72.  
  73.         update(0,0,n-1,idx,d);
  74.         dp[i]=d;
  75.     }
  76.  
  77.     int ans=0, prev;
  78.     stack<int> s;
  79.     for (int i=0; i<n; i++)
  80.         if (ans<=dp[i]) ans=dp[i], prev=i;
  81.    
  82.     printf("%d\n-\n", ans);
  83.     s.push(prev);
  84.  
  85.     for (int i=prev-1; i>=0; i--)
  86.         if (dp[i]+1==dp[prev] && a[i]<a[prev]) {
  87.             s.push(i);
  88.             prev=i;
  89.         }
  90.  
  91.     while (!s.empty()) {
  92.         printf("%d\n", a[s.top()]);
  93.         s.pop();
  94.     }
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement