BIT求助,爆0
  • 板块P6688 可重集
  • 楼主Tangent233
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/15 00:06
  • 上次更新2023/10/24 07:41:12
查看原帖
BIT求助,爆0
264548
Tangent233楼主2022/12/15 00:06
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+10;
const int g=2,mod=1e9+7;
/*inline int fpow(int k)
{
	int ans=1,bas=3;
	while(k)
	{
		if(k&1) ans=ans*bas%mod;
		bas=bas*bas%mod;
		k>>=1;
	}
	return ans%mod;
}*/
inline int lowbit(int x){return x&(-x);}
int BIT1[maxn],BIT2[maxn],bas1[maxn],bas2[maxn];
int n,m;
void modify(int *num,int x,int c)
{
	while(x<=n)
	{
		num[x]=(num[x]+c+mod)%mod;
		x+=lowbit(x);
	}
}
int ask(int *num,int x)
{
	int ans=0;
	while(x)
	{
		ans=ans+num[x]%mod;
		x-=lowbit(x);
	}
	return ans%mod;
}

void updata(int *BIT,int *num,int x)
{
	int lx;
	while(x<=n)
	{
		BIT[x]=num[x];
		lx=lowbit(x);
		for(int i=1;i<lx;i<<=1)
			BIT[x]=max(BIT[x],BIT[x-i]);
		x+=lowbit(x);
	}
}
int ask1(int *BIT,int *num,int l,int r)
{
	int ans=-1;
	while(r>=l)
	{
		ans=max(num[r],ans);
		r--;
		while(r-lowbit(r)>=l)
		{
			ans=max(BIT[r],ans);
			r-=lowbit(r);
		}
	}
	return ans;
}
int read(){
  int X=0;char ch=0;
  while(ch<48||ch>57)ch=getchar();
  while(ch>=48&&ch<=57)X=X*10+(ch^48),ch=getchar();
  return X;
}
int fpow[maxn];
signed main()
{
	n=read(),m=read();
	fpow[0]=1;
	for(int i=1;i<=1000000;i++) fpow[i]=1ll*fpow[i-1]*g%mod;
	for(int i=1;i<=n;i++)
	{
		int c=read();
		bas1[i]=c;updata(BIT1,bas1,i);
		modify(BIT2,i,fpow[c]);bas2[i]=fpow[c];
	}
	for(int i=1;i<=m;i++)
	{
		int opt=read();
		if(opt==1)
		{
			int l1=read(),r1=read(),l2=read(),r2=read();
			int min1=ask1(BIT1,bas1,l1,r1),min2=ask1(BIT1,bas1,l2,r2);
			int k=min1-min2<0?min2-min1:min1-min2;
			long long sum1=ask(BIT2,r1)-ask(BIT2,l1-1),sum2=ask(BIT2,r2)-ask(BIT2,l2-1);
			//cout<<sum1<<' '<<sum2<<' ';
			if(sum2*fpow[k]%mod==sum1||
			   sum1*fpow[k]%mod==sum2) cout<<"YES\n";
			else cout<<"NO\n";
		}
		else
		{
			int x=read(),y=read();
			modify(BIT2,x,-bas2[x]);
			bas1[x]=y;updata(BIT1,bas1,x);
			modify(BIT2,x,fpow[y]);bas2[x]=fpow[y];
		}
	}
	return 0;
}

基本上采用的是维护bas的k次幂的方法,已经尝试过define int longlong之类的东西了

2022/12/15 00:06
加载中...