社区讨论

P3792 维护平方和 WA 0pts 求调

P3792由乃与大母神原型和偶像崇拜参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lzrugwvs
此快照首次捕获于
2024/08/13 11:09
2 年前
此快照最后确认于
2024/08/13 17:23
2 年前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<random>
#define int long long
using namespace std;
typedef pair<int,int> pii;
const int mod=998244353;
const int N=5e5+10;
const int M=5e5+10;
const int inf=1e18;
int a[N];
int t[4*M],mint[4*M],maxt[4*M];
int n,m;
void pushup(int u){
	t[u]=(t[2*u]+t[2*u+1])%mod;
	mint[u]=min(mint[2*u],mint[2*u+1]);
	maxt[u]=max(maxt[2*u],maxt[2*u+1]);
}
void build(int u,int l,int r){
	if(l==r){
		t[u]=a[l]*a[l]%mod;
		mint[u]=a[l];
		maxt[u]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(2*u,l,mid);build(2*u+1,mid+1,r);
	pushup(u);
}
void modify(int u,int l,int r,int p,int x){
	if(l==r){
		t[u]=x*x%mod,mint[u]=x,maxt[u]=x;
		//cout<<"here"<<endl;
		return;
	}
	int mid=(l+r)>>1;
	if(p<=mid) modify(2*u,l,mid,p,x);
	else modify(2*u+1,mid+1,r,p,x);
	pushup(u);
}
pii querylmt(int u,int l,int r,int L,int R){//询问区间最值 
	if(L<=l&&r<=R){
		return {mint[u],maxt[u]};
	}
	int mid=(l+r)>>1,resmax=-inf,resmin=inf;
	if(L<=mid){
		pii tmp=querylmt(2*u,l,mid,L,R);
		resmin=min(resmin,tmp.first);
		resmax=max(resmax,tmp.second);
	}
	if(R>mid){
		pii tmp=querylmt(2*u+1,mid+1,r,L,R);
		resmin=min(resmin,tmp.first);
		resmax=max(resmax,tmp.second);
	}
	return {resmin,resmax};
}
int query(int u,int l,int r,int L,int R){//询问区间平方和 
	if(L<=l&&r<=R){
		return t[u]%mod;
	}
	int mid=(l+r)>>1,res=0;
	if(L<=mid) res+=query(2*u,l,mid,L,R);
	res%=mod;
	if(R>mid)  res+=query(2*u+1,mid+1,r,L,R);
	return res%mod;
}
signed main(){
	ios::sync_with_stdio(false);
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	//mt19937 rand(time(0));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	int opt,x,y;
	pii pr;
	int maxn,minn;
	while(m--){
		cin>>opt>>x>>y;
		if(opt==1){
			modify(1,1,n,x,y);
		}else{
			pr=querylmt(1,1,n,x,y);
			minn=pr.first,maxn=pr.second;
			//cout<<(maxn*(maxn+1)%mod*(2*maxn+1)%mod+mod-(minn-1)*(minn)%mod*(2*minn-1)%mod)%mod/6<<endl;
			//cout<<query(1,1,n,x,y)<<endl;
			if((maxn*(maxn+1)%mod*(2*maxn+1)%mod/6%mod+mod-(minn-1)*(minn)%mod*(2*minn-1)%mod/6%mod)%mod==query(1,1,n,x,y))
				cout<<"damushen"<<endl;//平方和公式 n(n+1)(2n+1)  m->n 
			else 
				cout<<"yuanxing"<<endl;
		}
	}
	return 0;
}
//使用线段树分别维护区间最值与平方和 
rt ,样例通过,但是查看提交记录WA的输出行数都比较靠后(?)
萌新刚学OI,大佬轻喷

回复

5 条回复,欢迎继续交流。

正在加载回复...