四叉树编码,bzoj4415 [Shoi2013]发牌 线段树

 2023-09-23 阅读 14 评论 0

摘要:相当于找区间第k个数,同时支持删点 这个题的线段树操作和noiD1T1有点像。所以调了半天。 四叉树编码。注意对size取模,注意查找区间第k的时候的特判 码: 线性四叉树编码 详解、 #include<iostream> #include<cstdio> using namespace std; #

相当于找区间第k个数,同时支持删点

这个题的线段树操作和noiD1T1有点像。所以调了半天。

四叉树编码。注意对size取模,注意查找区间第k的时候的特判


码:

线性四叉树编码 详解、

#include<iostream>
#include<cstdio>
using namespace std;
#define zuo o<<1,l,mid
#define you o<<1|1,mid+1,r
#define N 700005
int sz[N<<4],n,o,a,b,c,zz,op,i;
bool ky;
void up(int o)
{int ll=o<<1,rr=o<<1|1;sz[o]=sz[ll]+sz[rr];
}
void jian(int o,int l,int r)
{if(l==r){sz[o]=1;return ;}int mid=(l+r)>>1;jian(zuo);jian(you);	up(o);	
}
void gai(int o,int l,int r)
{	int mid=(l+r)>>1;if(a<=l&&b>=r){if(op==0)sz[o]=0;		if(op==1) c+=sz[o];return ;}if(a<=mid)gai(zuo);if(b>mid)gai(you);up(o);
}
void cha(int o,int l,int r)
{
int mid=(l+r)>>1;if(a<=l&&r<=b){
if(sz[o]<c){c-=sz[o];return ;}
if(l==r){c=l,ky=1;return;}if(sz[o<<1]<c){  	c-=sz[o<<1];cha(you);	}else{
cha(zuo);	 }	return ;	}	if(a<=mid)cha(zuo);if(b>mid&&ky==0)cha(you);
}
int main()
{scanf("%d",&n);jian(1,1,n);zz=1;for(i=1;i<=n;i++){scanf("%d",&o);o%=sz[1];if(i==n){printf("%d",zz);return 0;}
o++;//找位置op=1;a=zz;b=n;c=0;gai(1,1,n);if(c<o){o-=c;a=1;b=zz;}else{	a=zz;b=n;}ky=0;c=o;cha(1,1,n);//输出printf("%d\n",c);zz=c;op=0;a=b=c;gai(1,1,n);		//换位置 op=1;a=zz;b=n;c=0; gai(1,1,n);if(c==0){a=1;b=n;	}else{a=zz;b=n;}ky=0;			 c=1;cha(1,1,n);zz=c;		}
}


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/91014.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息