萌新求助owo
查看原帖
萌新求助owo
264548
Tangent233楼主2021/12/26 21:05
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
//========================================================
int n,m,c;
long long num[maxn],color[maxn],BIT1[maxn],BIT2[maxn];
inline int lowbit(int x)
{
	return x&(-x);
}
long long sum(int x)
{
	long long ans=0;
	while(x)
	{
		ans+=BIT1[x];
		x-=lowbit(x);
	}
	return ans;
}
void updata(int x,int now)
{
	int delta=now-num[x];
	int tmpx=x;
	while(tmpx<=n)
	{
		BIT1[tmpx]+=delta;
		tmpx+=lowbit(tmpx);
	}
	num[x]=now;
	tmpx=x;
	int lx;
	while(tmpx<=n)
	{
		BIT2[tmpx]=num[tmpx];
		lx=lowbit(tmpx);
		for(int i=1;i<lx;i<<=1)
			BIT2[tmpx]=max(BIT2[tmpx],BIT2[tmpx-i]);
		tmpx+=lowbit(tmpx);
	}
}
inline long long asksum(int l,int r)
{
	return sum(r)-sum(l-1);
}
long long askmax(int l,int r)
{
	long long ans=-1;
	while(r>=l)
	{
		ans=max(num[r],ans);
		r--;
		while(r-lowbit(r)>=l)
		{
			ans=max(BIT2[r],ans);
			r-=lowbit(r);
		}
	}
	return ans;
}
//========================================================
#define IT set<node>::iterator
struct node
{
	int l,r,c;
	mutable long long v,mx;
	node(int L,int R=-1,int C=0,long long V=0,long long MX=-1):l(L),r(R),c(C),v(V),mx(MX){}
	bool operator<(const node& o) const
	{
		return l<o.l;
	}
};
set<node> s;
IT split(int pos)
{
	IT it=s.lower_bound(node(pos));
	if(it!=s.end()&&it->l==pos) return it;
	--it;
	int L=it->l,R=it->r,C=it->c;
	long long v1=asksum(L,pos-1),v2=asksum(pos,R),
	mx1=askmax(L,pos-1),mx2=askmax(pos,R);
	s.erase(it);
	s.insert(node(L,pos-1,C,v1,mx1));
	return s.insert(node(pos,R,C,v2,mx2)).first;
}
void assign(int l,int r,int color)
{
	long long val=asksum(l,r),mx=askmax(l,r);
	IT itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,color,val,mx));
}
void remake(int pos)
{
	IT it=s.lower_bound(node(pos));
	int L=it->l,R=it->r;
	it->v=asksum(L,R);
	it->mx=askmax(L,R);
}
//========================================================
int colorcnt[500];
void opt1(int x,int y)
{
	updata(x,y);
	remake(x);
}
inline void opt2(int x,int y,int c)
{
	assign(x,y,c);
}

long long opt3(int x,int y)
{
	memset(colorcnt,0,sizeof(colorcnt));
	IT itr=split(y+1),itl=split(x);
	IT head=itl,tail=itl;
	long long nowc=0,ans=(long long)1e11+7;
	while(tail!=itr)
	{
		int C1=tail->c;
		long long V1=tail->v;
		colorcnt[C1]++;
		nowc+=V1;
		int C2=head->c;
		long long V2=head->v;
		while(colorcnt[C2]-1>0&&head!=tail)
		{
			nowc-=V2;
			colorcnt[C2]--;
			head++;
		}
		bool flag=1;
		for(int i=1;i<=c;i++)
			if(colorcnt[i]==0)
			{
				flag=0;
				break;
			}
		if(flag)
		{
			long long tmpc=nowc;
			tmpc=tmpc-V1-V2;
			int L1=tail->l,R2=head->r;
			tmpc=tmpc+num[L1]+num[R2];
			ans=min(tmpc,ans);
		}
		tail++;
	}
	return ans;
}
long long opt4(int x,int y)
{
	IT itr=split(y+1),itl=split(x);
	IT itmp;
	long long nowc=0,ans=-1;
	while(itl!=itr)
	{
		itmp=itl;itmp++;
		if(itmp==itr) break;
		int L1=itl->l,L2=itmp->l,R1=itl->r,R2=itmp->r,C1=itl->c,C2=itmp->c;
		long long MX=itl->mx;
		ans=max(ans,MX);
		if(C1==C2) nowc=0;
		else
		{
			nowc=nowc+num[R1]+num[L2];
			ans=max(ans,nowc);
			if(R2-L2+1>1) nowc=0;
			else nowc-=num[L2];
		}
		itl++;
	}
	return ans;
}
//========================================================
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main()
{
	n=read(),m=read(),c=read();
	for(int i=1;i<=n;i++)
	{
		int x=read();
		updata(i,x);
		num[i]=x;
	}
	for(int i=1;i<=n;i++)
	{
		color[i]=read();
		s.insert(node{i,i,color[i],num[i],num[i]});
	}
	while(m--)
	{
		int opt,x,y,z1;
		opt=read();
		if(opt==1)
		{
			x=read(),y=read();	
			opt1(x,y);
		}
		else if(opt==2) 
		{
			x=read(),y=read(),z1=read();
			opt2(x,y,z1);
		}
		else if(opt==3)
		{
			x=read(),y=read();
			long long tmp=opt3(x,y);
			if(tmp<1e10) printf("%lld\n",tmp);
			else printf("-1\n");
		}
		else 
		{
			x=read(),y=read();
			printf("%lld\n",opt4(x,y));
		}
	}
	return 0;
}

运行百行10k代码错误究竟在哪

2021/12/26 21:05
加载中...