站外题求调
  • 板块学术版
  • 楼主Tangent233
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/5/29 19:41
  • 上次更新2023/10/28 00:19:33
查看原帖
站外题求调
264548
Tangent233楼主2022/5/29 19:41
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10,blen=450,blim=blen*2;
//===============================================
int siz[blen],nxt[blen],blc[blen][blim+10];
int n,tot=1;
pair<int, int> askdis(int dis)
{
	int now=1;
	while(dis>siz[now])
	{
		dis-=siz[now];
		now=nxt[now];
	}
	//pair<int, int> tmp=make_pair(now,dis);
	return make_pair(now,dis);
}
void rmk(int bnum)
{
	tot++;
	for(int i=blen+1;i<=siz[bnum];i++)
	{
		blc[tot][i-blen]=blc[bnum][i];
		blc[bnum][i]=0;
		siz[bnum]--;siz[tot]++;
	}
	int x1=nxt[bnum],x2=tot;
	nxt[bnum]=x2;nxt[x2]=x1;
}
void ins(int dis,int x)
{
	pair<int,int> noww=askdis(dis);
	int nowb=noww.first,dis1=noww.second;
	for(int i=siz[nowb]+1;i>=dis1+1;i--)
		blc[nowb][i]=blc[nowb][i-1];
	blc[nowb][dis1]=x;
	siz[nowb]++;
	if(siz[nowb]>=blim) rmk(nowb);
}
int ask(int dis)
{
	pair<int,int> now=askdis(dis);
	int nowb=now.first,dis1=now.second;
	return blc[nowb][dis1];
}
//===============================================
inline int read()
{
	int f=1,r=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){r=r*10+c-'0';c=getchar();}
	return f*r;
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		/*
		int a=read();
		ins(i,a);
		*/
		int a=read(),bnum=(i-1)/blen+1;
		blc[bnum][i-(bnum-1)*blen]=a;
		siz[bnum]++;
	}
	tot=(n-1)/blen+1;
	for(int i=1;i<tot;i++)
		nxt[i]=i+1;
	
	for(int i=1;i<=n;i++)
	{
		int a=read(),b=read(),c=read(),d=read();
		if(a==0) ins(b,c);
		if(a==1) cout<<ask(c)<<endl;
	}
	return 0;
}

loj6282 数列分块入门5

2022/5/29 19:41
加载中...