申请开大时限
  • 板块P6688 可重集
  • 楼主whiteqwq
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/7/27 16:30
  • 上次更新2023/11/6 22:05:45
查看原帖
申请开大时限
35754
whiteqwq楼主2020/7/27 16:30

感觉能加的优化都加了,但是还是稳稳地T了5个点,可以开大一点时限吗?

(或者是我错了?)

#include<stdio.h>
#define inf 1000000000
const int maxn=1000005;
const long long Base=5,mod=1777771;
int i,j,k,m,n,opt,x,y,l1,r1,l2,r2,minn1,minn2,maxx1,maxx2,sum1,sum2,flg;
long long pow[maxn],a[maxn];
inline long long min(long long a,long long b){
	return a<b? a:b;
}
inline long long max(long long a,long long b){
	return a>b? a:b;
}
inline int read(){
	int x=0;
	char c=getchar();
	for(;c<'0'||c>'9';c=getchar());
	for(;c>='0'&&c<='9';c=getchar())
		x=x*10+c-48;
	return x;
}
struct Segment_Tree{
	int lc[maxn<<2],rc[maxn<<2];
	long long minn[maxn<<2],maxx[maxn<<2],sum[maxn<<2];
	inline void pushup(int now){
		minn[now]=min(minn[lc[now]],minn[rc[now]]);
		maxx[now]=max(maxx[lc[now]],maxx[rc[now]]);
		sum[now]=(sum[lc[now]]+sum[rc[now]])%mod;
	}
	void build(int l,int r,int now){
		if(l==r){
			minn[now]=maxx[now]=a[l],sum[now]=pow[a[l]];
			return ;
		}
		int mid=(l+r)>>1;
		lc[now]=now<<1,rc[now]=now<<1|1;
		build(l,mid,lc[now]),build(mid+1,r,rc[now]);
		pushup(now);
	}
	void modify(int l,int r,int now,int pos,long long v){
		if(l==r){
			minn[now]=maxx[now]=v,sum[now]=pow[v];
			return ;
		}
		int mid=(l+r)>>1;
		if(pos<=mid)
			modify(l,mid,lc[now],pos,v);
		if(mid<pos)
			modify(mid+1,r,rc[now],pos,v);
		pushup(now);
	}
	int query(int l,int r,int now,int L,int R,int t){
		if(L<=l&&r<=R)
			return t==0? sum[now]:(t==1? minn[now]:maxx[now]);
		int mid=(l+r)>>1,res=t==0? 0:(t==1? inf:-inf);
		if(L<=mid)
			res=t==0? (res+query(l,mid,lc[now],L,R,t))%mod:(t==1? min(res,query(l,mid,lc[now],L,R,t)):max(res,query(l,mid,lc[now],L,R,t)));
		if(mid<R)
			res=t==0? (res+query(mid+1,r,rc[now],L,R,t))%mod:(t==1? min(res,query(mid+1,r,rc[now],L,R,t)):max(res,query(mid+1,r,rc[now],L,R,t)));
		return res;
	}
}ST;
int main(){
	pow[0]=1;
	for(i=1;i<maxn;i++)
		pow[i]=pow[i-1]*Base%mod;
	n=read(),m=read();
	for(i=1;i<=n;i++)
		a[i]=read();
	ST.build(1,n,1);
	for(i=1;i<=m;i++){
		opt=read();
		if(opt==0){
			x=read(),y=read(); 
			ST.modify(1,n,1,x,y);
		}
		if(opt==1){
			l1=read(),r1=read(),l2=read(),r2=read();
			minn1=ST.query(1,n,1,l1,r1,1),minn2=ST.query(1,n,1,l2,r2,1);
			maxx1=ST.query(1,n,1,l1,r1,2),maxx2=ST.query(1,n,1,l2,r2,2);
			if(minn1-minn2==maxx1-maxx2){
				sum1=ST.query(1,n,1,l1,r1,0),sum2=ST.query(1,n,1,l2,r2,0);
				flg=minn1<=minn2? sum1*pow[minn2-minn1]%mod==sum2:sum2*pow[minn1-minn2]%mod==sum1;
			}
			else flg=0;
			if(flg==1)
				putchar('Y'),putchar('E'),putchar('S');
			else putchar('N'),putchar('O');
			putchar('\n'); 
		}
	}
	return 0;
}
2020/7/27 16:30
加载中...