块状链表WA求助
查看原帖
块状链表WA求助
419144
chenjunxiu楼主2021/8/7 23:51
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10,M=460,inf=-2e9;
int n,m,len=40,t,nc[2*M],sum;
ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(ll x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
}
struct K{
	int l,r,len;
	ll b[2*M],sum,lsum,rsum,mx;
}a[2*M];
int get(int &p){
	int kp=a[0].r;
	while(a[kp].len<p){
		p-=a[kp].len;
		kp=a[kp].r;
	}
	p--;
	return kp;
}
void update(int p){
	ll s=0;
	a[p].sum=0;
	a[p].lsum=a[p].rsum=a[p].mx=inf;
	for(int i=0;i<a[p].len;i++){
		s=max(s,s+a[p].b[i]);
		a[p].mx=max(a[p].mx,s);
		a[p].sum+=a[p].b[i];
		a[p].lsum=max(a[p].sum,a[p].lsum);
	}
	s=0;
	for(int i=a[p].len-1;i>=0;i--){
		s+=a[p].b[i];
		a[p].rsum=max(s,a[p].rsum);
	}
}
void build(int p){
	int nw=nc[t--];
	a[nw].l=p;
	a[nw].r=a[p].r;
	a[a[p].r].l=nw;
	a[p].r=nw;
	a[nw].len=0;
}
void del(int p){
	nc[++t]=p;
	a[a[p].l].r=a[p].r;
	a[a[p].r].l=a[p].l;
}
void split(int p){
	build(p);
	a[a[p].r].len=a[p].len/2;
	for(int i=0;i<a[a[p].r].len;i++)
		a[a[p].r].b[i]=a[p].b[a[p].len-a[a[p].r].len+i];
	a[p].len-=a[a[p].r].len;
	update(p);
	update(a[p].r);
}
void merge(){
	for(int p=a[0].r;a[p].r;p=a[p].r){
		if(a[p].len+a[a[p].r].len<2*len){
			for(int i=0;i<a[a[p].r].len;i++)
				a[p].b[a[p].len+i]=a[a[p].r].b[i];
			a[p].len+=a[a[p].r].len;
			update(p);
			del(a[p].r);
		}
	}
}
void insert(int p,int x){
	int kp;
	if(p==sum){
		kp=a[0].l;
		a[kp].b[a[kp].len++]=x;
		update(kp);
		if(a[kp].len>len*2)
			split(kp);
		return;
	}
	kp=get(p);
	for(int i=a[kp].len-1;i>=p;i--)
		a[kp].b[i+1]=a[kp].b[i];
	a[kp].len++;
	a[kp].b[p]=x;
	update(kp);
	if(a[kp].len>len*2)
		split(kp);
}
void remove(int p){
	int kp=get(p);
	for(int i=p+1;i<a[kp].len;i++)
		a[kp].b[i-1]=a[kp].b[i];
	a[kp].len--;
	if(!a[kp].len)
		del(kp);
	else
		update(kp);
}
void change(int p,int x){
	int kp=get(p);
	a[kp].b[p]=x;
	update(kp);
}
int ask(int l,int r){
	int kl=get(l),kr=get(r);
	ll ml=inf,mr=inf,mx=inf;
	ll lsum=inf,rsum=inf,s=0,sum=0;
	if(kl==kr){
		for(int i=l;i<=r;i++){
			s=max(s+a[kl].b[i],a[kl].b[i]);
			mx=max(mx,s);
		}
		return mx;
	}
	for(int i=a[kl].len-1;i>=l;i--){
		sum+=a[kl].b[i];
		lsum=max(lsum,sum);
		s=max(s+a[kl].b[i],a[kl].b[i]);
		ml=max(ml,s);
	}
	sum=s=0;
	for(int i=0;i<=r;i++){
		sum+=a[kr].b[i];
		rsum=max(rsum,sum);
		s=max(s+a[kr].b[i],a[kr].b[i]);
		mr=max(mr,s);
	}
	mx=max(ml,mr);
	lsum=max(lsum,(ll)0);
	rsum=max(rsum,(ll)0);
	for(int p=a[kl].r;p!=kr;p=a[p].r){
		mx=max(mx,a[p].mx);
		mx=max(mx,lsum+a[p].lsum);
		lsum=max(lsum+a[p].sum,a[p].rsum);
		lsum=max(lsum,(ll)0);
	}
	mx=max(mx,lsum+rsum);
	return mx;
}
int main(){
	char op;
	ll x,y;
	t=M*1.5;
	for(int i=1;i<=M*1.5;i++)
		nc[i]=i;
    n=read();
    a[0].l=a[0].r=1;
    for(int i=1;i<=n;i++){
    	x=read();
    	sum++;
    	insert(i,x);
	}
	m=read();
	for(int i=1;i<=m;i++){
		cin>>op;
		x=read();
		if(op=='I'){
			y=read();
			sum++;
			insert(x,y);
		}
		if(op=='D'){
			sum--;
			remove(x);
		}
		if(op=='R'){
			y=read();
			change(x,y);
		}
		if(op=='Q'){
			y=read();
			write(ask(x,y)),putchar('\n');
		}
		if(!(i%450))
			merge();
	}
	return 0;
}
2021/8/7 23:51
加载中...