BZOJ 4415 [Shoi2013]发牌【线段树

80 篇文章 0 订阅
14 篇文章 0 订阅

裸的线段树的题,就像值域线段树一样记录一下size查询rank就好了……

喵的……为什么windows下跑得这么慢…………于是我对着AC的代码调了一上午……

极限数据本机三秒三,交上去0.4s……

惨啊……优化常数搞了一上午写了人生第一发读入输出优化2333


#include<bits/stdc++.h>
#define MAXN 700023
//#define FLAZE_NAIVE
using namespace std;	int N,n;
int dt[MAXN<<3];

void build(int now,int l,int r){
	if(l==r)	return dt[now]=1,void();
	int mid=(l+r)>>1;
	build(now<<1,l,mid);
	build(now<<1|1,mid+1,r);
	dt[now]=r-l+1;
}

int inqry(int now,int l,int r,int rk){
#ifdef FLAZE_NAIVE
	printf("l = %d    r = %d     siz[ now ] = %d\n",l,r,dt[now]);
#endif
	if(l==r)	return dt[now]=0,l;
	int mid=(l+r)>>1;
	int rtn;
	if(rk<=dt[now<<1])	rtn=inqry(now<<1,l,mid,rk);
	else	rtn=inqry(now<<1|1,mid+1,r,rk-dt[now<<1]);
	--dt[now];
	return rtn;
}

char read_s[10];
int read_rtn,lth;
int read(){
	read_rtn=0;
	scanf("%s",read_s);
	lth=strlen(read_s);
	for(int i=0;i<lth;++i)
		read_rtn=read_rtn*10+read_s[i]-'0';
	return read_rtn;
}

void write(int x){
	lth=0;
	while(x)
		read_s[lth++]=x%10+'0',x/=10;
	for(int i=lth-1;~i;--i)	putchar(read_s[i]);
	putchar('\n');
}

int read_r;
int main(){

//	scanf("%d",&n);
	n=read();
	N=n;
	build(1,1,N);
	int now=1;
	int kk;
	while(n){
		read_r=read();
//		scanf("%d",&read_r);
#ifdef FLAZE_NAIVE
		printf("r = %d      now = %d     n = %d\n",read_r,now,n);
#endif
		read_r=(read_r+now)%n;
		if(!read_r)	read_r=n;
#ifdef FLAZE_NAIVE
		printf("rank = %d\n",read_r);
#endif	
		now=read_r;
		kk=inqry(1,1,N,read_r);
		write(kk);
//		printf("%d\n",inqry(1,1,N,read_r));
		--n;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值