块状链表求助
  • 板块学术版
  • 楼主A6n6d6y6
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/23 11:53
  • 上次更新2023/11/2 18:34:30
查看原帖
块状链表求助
750329
A6n6d6y6楼主2023/9/23 11:53

rt,题目是数列分块入门 6。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10,sqn=sqrt(maxn);
struct node{
	int a[(sqn<<1)+10],size;
	node* nxt;
	node(){size=0;nxt=nullptr,memset(a,0,sizeof a);}
	void push_back(int c){a[size++]=c;}
}*p=new node,*head=p;
bool check(node* p){
	if(p->size<(sqn<<1))return 0;
	node* q=new node;
	for(int i=sqn;i<=p->size;i++)q->push_back(p->a[i]);
	p->size=sqn;q->nxt=p->nxt;p->nxt=q;
	return 1;
}
void insert(int pos,int c){
	node* p=head;
	int tot;
	for(tot=head->size;tot<pos;p=p->nxt,tot+=p->size);
	tot-=p->size;
	for(int i=p->size-1;i>=pos-tot;i--)p->a[i+1]=p->a[i];
	p->a[pos-tot]=c;p->size++;
	check(p);
}
int query(int pos){
	node* p=head;
	int tot;
	for(tot=head->size;tot<pos;p=p->nxt,tot+=p->size);
	tot-=p->size;
	return p->a[pos-tot];
}
int n,a;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a,p->push_back(a);
		if(check(p))p=p->nxt;
	}
	for(int i=1;i<=n;i++){
		int op,l,r,c;
		cin>>op>>l>>r>>c;
		if(op==0)insert(l-1,r);
		if(op==1)cout<<query(r-1)<<endl;
	}
	return 0;
}
2023/9/23 11:53
加载中...