Tokitsukaze and Hash Table

tokitsukaze and Hash Table

http://www.nowcoder.com/questionTerminal/b29e0152abcd4049acbebc7358410fe8

线段树上二分即可

没错我来误导大家了

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int ans=0,f=1;char chr=getchar();
    while(!isdigit(chr)){if(chr=='-')f=-1;chr=getchar();}
    while(isdigit(chr)) {ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
    return ans*f;
}const int M = 1e6+5;
int s[M<<2],n,a[M],t[M<<2],ans[M];
#define ls (i<<1)
#define rs (i<<1|1)
#define mid (l+r>>1)
inline void Push_Up(int i){s[i]=s[ls]+s[rs];}
void Update(int i,int l,int r,int x,int sum){
    if(l==r){++s[i],t[i]=sum;return;}
    if(x<=mid) Update(ls,l,mid,x,sum);
    else Update(rs,mid+1,r,x,sum);
    Push_Up(i);
}
int query(int i,int l,int r,int x){
    if(l==r) return t[i];
    Push_Up(i);
    if(x<=mid) return query(ls,l,mid,x);
    return query(rs,mid+1,r,x);
}
int Query_Try(int i,int l,int r,int ql,int qr){
    if(l==r){if(!s[i]) return l;return n+1;}
    if(ql<=l&&r<=qr){
        if((mid-l+1)-s[ls]!=0)return Query_Try(ls,l,mid,ql,qr);
        return Query_Try(rs,mid+1,r,ql,qr);
    }int ans=0;
    if(ql<=mid&&mid-l+1-s[ls]!=0)ans=Query_Try(ls,l,mid,ql,qr);
    if(ans<ql||ans>qr)return Query_Try(rs,mid+1,r,ql,qr);
    return ans;
}
int main(){
    n=read();
    for(register int i=1;i<=n;++i){
        int x=read();
        register int l=x%n+1,r=n,pos=n+1;
        pos=Query_Try(1,1,n,l,r);
        if(pos==n+1)pos=Query_Try(1,1,n,1,l-1);
        Update(1,1,n,pos,x);
    }for(int i=1;i<=n;i++)printf("%d ",query(1,1,n,i));
    return 0;
}
全部评论

相关推荐

神哥不得了:首先我就是在成都,成都的互联网格外的卷,如果是凭现在的简历的话很难找到大厂,建议再添加一个高质量的项目上去,另外专业技能的话最好是超过每一条的一半
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务