zoukankan      html  css  js  c++  java
  • BZOJ 3401: [Usaco2009 Mar]Look Up 仰望(离线+平衡树)

    刷银组刷得好开心= =

    离线按权值排序,从大到小插入二叉树,查找树中比这个数大的

    CODE:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define maxn 100010
    struct node{
     int ch[2],x,r;
    }t[maxn];
    int cmp(int x,int y){
     if (t[x].x>y) return 0;
     if (t[x].x==y) return -1;
     return 1;
    }
    int rotate(int &x,int d){
     int u=t[x].ch[d];
     t[x].ch[d]=t[u].ch[d^1];
     t[u].ch[d^1]=x;
     x=u;
     return 0;
    }
    int l;
    int insert(int &x,int y){
     if (x==0) {x=++l;t[x]=(node){{0,0},y,rand()};return 0;}
     int d=cmp(x,y);
     insert(t[x].ch[d],y);
     if (t[t[x].ch[d]].r>t[x].r) rotate(x,d);
     return 0;
    }
    int an;
    int maxnum(int x,int y){
     if (x==0) return 0;
     int d=cmp(x,y);
     if (d==0) an=t[x].x;
     maxnum(t[x].ch[d],y);
     return 0;
    }
    int id[maxn],ans[maxn],a[maxn];
    bool cmp1(int x,int y){
     if (a[x]==a[y]) return x<y;
     return a[x]>a[y];
    }
    int main(){
     int n;
     scanf("%d",&n);
     for (int i=1;i<=n;i++) scanf("%d",a+i);
     for (int i=1;i<=n;i++) id[i]=i;
     sort(id+1,id+1+n,cmp1);
     int root=0;
     for (int i=1;i<=n;i++) {
      an=0;
      maxnum(root,id[i]);
      ans[id[i]]=an;
      insert(root,id[i]);
     }
     for (int i=1;i<=n;i++) printf("%d ",ans[i]);
     return 0;
    }

  • 相关阅读:
    maven继承父工程统一版本号
    shiro权限控制参考
    动态查询列表页面的分页
    SVN服务器更改ip地址后怎么办
    cookie记住密码功能
    分享小插件的问题
    阿里云短信验证
    从svn上更新maven项目时,所有文件变成包的形式
    Maven工具
    Mybatis的dao层传递单参出现的问题
  • 原文地址:https://www.cnblogs.com/New-Godess/p/4348938.html
Copyright © 2011-2022 走看看