• BZOJ 4415: [Shoi2013]发牌


    线段树模拟

    #include<cstdio>
    using namespace std;
    int sz[20000005];
    void update(int t){
    	sz[t]=sz[t<<1]+sz[t<<1|1];
    }
    void build(int t,int l,int r){
    	if (l==r){
    		sz[t]=1;
    		return;
    	}
    	int mid=(l+r)>>1;
    	build(t<<1,l,mid);
    	build(t<<1|1,mid+1,r);
    	update(t);
    }
    void modify(int t,int l,int r,int x){
    	if (l==r){
    		sz[t]=0;
    		return;
    	}
    	int mid=(l+r)>>1;
    	if (x<=mid) modify(t<<1,l,mid,x);
    	else modify(t<<1|1,mid+1,r,x);
    	update(t);
    }
    int query_suf(int t,int l,int r,int x){
    	if (l==r) return 0;
    	int mid=(l+r)>>1;
    	if (x<=mid) return sz[t<<1|1]+query_suf(t<<1,l,mid,x);
    	else return query_suf(t<<1|1,mid+1,r,x);
    }
    int query_pre(int t,int l,int r,int x){
    	if (l==r) return sz[t];
    	int mid=(l+r)>>1;
    	if (x<=mid) return query_pre(t<<1,l,mid,x);
    	else return sz[t<<1]+query_pre(t<<1|1,mid+1,r,x);
    }
    int query_Kth(int t,int l,int r,int K){
    	if (l==r) return l;
    	int mid=(l+r)>>1;
    	if (K<=sz[t<<1]) return query_Kth(t<<1,l,mid,K);
    	else return query_Kth(t<<1|1,mid+1,r,K-sz[t<<1]);
    }
    int main(){
    	int n;
    	scanf("%d",&n);
    	int last=0,m=n;
    	build(1,0,n-1);
    	for (int i=1; i<=n; i++){
    		int x;
    		scanf("%d",&x);
    		x%=m;
    		m--;
    		int ID=query_suf(1,0,n-1,last);
    		if (ID>=x){
    			int now=query_pre(1,0,n-1,last);
    			now+=x;
    			last=query_Kth(1,0,n-1,now);
    		}
    		else{
    			x-=ID;
    			last=query_Kth(1,0,n-1,x);
    		}
    		int now=query_pre(1,0,n-1,last);
    		modify(1,0,n-1,last);
    		printf("%d
    ",last+1);
    		if (now>m) now=1;
    		last=query_Kth(1,0,n-1,now);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    c#基础之集合
    找出子字符串在字符串中的所有索引
    c# 排序
    C#基础之枚举
    验证用户名不为空并且不存在
    验证用户名和密码,输入三次不正确就锁定账号
    c#基础
    linux使用
    python之logging模块
    手写MyBatis,纯手工打造开源框架(第三篇:运筹帷幄)
  • 原文地址:https://www.cnblogs.com/silenty/p/9858369.html
Copyright © 2020-2023  润新知