zoukankan      html  css  js  c++  java
  • BZOJ 4415 发牌

    线段树
    记录当前位于牌堆第几张,不搬牌,发牌即询问第K个可用位置
    注意对Size取模即可

    #include <cstdio>
    
    const int MAXN=700111;
    
    int N;
    int R[MAXN];
    int At, Cnt;
    
    struct Node{
    	int l, r, cnt;
    } T[MAXN<<2];
    
    void BuildTree(int l, int r, int at){
    	T[at].l=l;T[at].r=r;T[at].cnt=(r-l+1);
    	if(l==r)	return;
    	int m=(l+r)>>1;
    	BuildTree(l, m, at<<1);
    	BuildTree(m+1, r, (at<<1)|1);
    }
    
    void Update(int at, int p){
    	--T[at].cnt;
    	if(T[at].l==T[at].r)	return;
    	int m=(T[at].l+T[at].r)>>1;
    	if(p<=m)	Update(at<<1, p);
    	else	Update((at<<1)|1, p);
    }
    
    int Ask(int at, int k){
    	int m=(T[at].l+T[at].r)>>1;
    	if(T[at].l==T[at].r)	return m;
    	int ls=T[at<<1].cnt;
    	if(k<=ls)	return Ask(at<<1, k);
    	return Ask((at<<1)|1, k-ls);
    }
    
    int main(){
    	
    	scanf("%d", &N);
    	
    	BuildTree(1, N, 1);
    	
    	At=1;Cnt=N;
    	
    	for(int i=1, r, v;i<=N;++i){
    		scanf("%d", &r);
    		At+=r;At%=Cnt;if(!At)	At+=Cnt;
    		v=Ask(1, At);Update(1, v);
    		printf("%d
    ", v);--Cnt;
    	}
    	
    	return 0;
    }
    
    /*
    4
    2
    0
    3
    2
    
    3
    4
    2
    1
    
    */
    
  • 相关阅读:
    java ,js获取web工程路径
    js 无刷新分页代码
    js 获取时间对象代码
    jquery 文本框失去焦点显示提示信息&&单击置空文本框
    CodeForces
    nth_element() O(n)复杂度求第k+1小元素
    CodeForces
    HDU
    杜教BM
    J
  • 原文地址:https://www.cnblogs.com/Pickupwin/p/BZOJ4415.html
Copyright © 2011-2022 走看看