卡常求助
  • 板块P6688 可重集
  • 楼主ducati
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/8/19 10:14
  • 上次更新2023/11/6 19:57:47
查看原帖
卡常求助
87064
ducati楼主2020/8/19 10:14
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxlen=1000000,mod=998244353,base=1000007;

int n,q,opt,x,y,x2,y2,tim;
int a[maxlen+5],num[maxlen+5],tree[8*maxlen+5],tag[8*maxlen+5],ltree[4*maxlen+5];

inline void pushup(int rt)
{
	tree[rt]=max(tree[rt<<1],tree[(rt<<1)|1]);
}

int quick_power(int x,int y)
{
	int res=1;
	for (;y;y=y>>1,x=(x*x)%mod)
	{
		if (y&1)  res=(res*x)%mod;
	}
	return res;
}

inline void build_tree(int l,int r,int rt)
{
	if (l==r)
	{
		tree[rt]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	
	build_tree(l,mid,rt<<1);
	build_tree(mid+1,r,(rt<<1)|1);
	pushup(rt); 
}

inline void f(int l,int r,int rt,int k)
{
	tree[rt]+=k;
	tag[rt]+=k;
}

inline void pushdown(int l,int r,int rt)
{
	int mid=(l+r)>>1;
	
	f(l,mid,rt<<1,tag[rt]);
	f(mid+1,r,(rt<<1)|1,tag[rt]);
	tag[rt]=0;
}

inline void change(int nl,int nr,int l,int r,int rt,int k)
{
	if (nl<=l&&r<=nr)
	{
		f(l,r,rt,k);
		return;
	}
	pushdown(l,r,rt);
	
	int mid=(l+r)>>1;
	if (nl<=mid)  change(nl,nr,l,mid,rt<<1,k);
	if (nr>mid)  change(nl,nr,mid+1,r,(rt<<1)|1,k);
	
	pushup(rt);
}

inline int query(int nl,int nr,int l,int r,int rt)
{
	int mid=(l+r)>>1,ans=0;
	pushdown(l,r,rt);
	
	if (nl<=l&&r<=nr)  return tree[rt];
	if (nl<=mid)  ans=max(ans,query(nl,nr,l,mid,rt<<1));
	if (nr>mid)  ans=max(ans,query(nl,nr,mid+1,r,(rt<<1)|1));
	
	return ans;
}

inline int lowbit(int k)
{
	return k&(-k);
}

inline void change_ltree(int rt,int num)
{
	while (rt<=n)
	{
		ltree[rt]=(ltree[rt]+num)%mod;
		rt+=lowbit(rt);
	}
}

inline int query_ltree(int rt)
{
	int tot=0;
	while (rt>=1)
	{
		tot=tot+ltree[rt];
		rt-=lowbit(rt);
	}
	return tot%mod;
}

inline int query2(int l,int r)
{
	return ((query_ltree(r)-query_ltree(l-1))%mod+mod)%mod;
}

inline int read()
{
	int s=0,w=1;
	char ch=getchar();
	
	while (ch<'0'||ch>'9')
	{
		if (ch=='-')  w=-w;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9')
	{
		s=(s<<1)+(s<<3)+(ch^'0');
		ch=getchar();
	}
	return s*w;
}

signed main()
{
	cin>>n>>q;
	for (int i=1;i<=n;i++)  a[i]=read();
	for (int i=1;i<=n;i++)
	{
		num[i]=quick_power(base,a[i]);
		change_ltree(i,num[i]);
	}
	build_tree(1,n,1);
	while (q--)
	{
		opt=read();
		if (opt==0)
		{
			x=read(),y=read();
			change(x,x,1,n,1,y-a[x]);
			a[x]=y;
			change_ltree(x,((quick_power(base,y)-num[x])%mod+mod)%mod);
			num[x]=quick_power(base,y);
		}
		else
		{
			x=read(),y=read(),x2=read(),y2=read();
			tim=query(x2,y2,1,n,1)-query(x,y,1,n,1);
			if (tim<0&&(query2(x2,y2)*quick_power(base,-tim))%mod==query2(x,y)%mod)
			{
				puts("YES");
			}
			else if (tim>=0&&(query2(x,y)*quick_power(base,tim))%mod==query2(x2,y2)%mod)  puts("YES");	
			else puts("NO");
		}
	}
	return 0;
}

保证代码的正确性以及时间复杂度(不含常数)的正确性(只有AC和TLE),只需要提建议就可以啦QAQ

registerregister加了并没有什么效果QWQ

2020/8/19 10:14
加载中...