社区讨论
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 条回复,欢迎继续交流。
正在加载回复...