玄学错误求助(悬关
  • 板块P5142 区间方差
  • 楼主Sad_Rex
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/7/19 16:21
  • 上次更新2023/11/3 08:51:31
查看原帖
玄学错误求助(悬关
704234
Sad_Rex楼主2023/7/19 16:21

不知道为啥样例没过

#include<bits/stdc++.h>
//#pragma GCC optimize(3, "Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
using namespace std;
#define int long long
#define kg putchar(' ')
#define endl puts("")
inline int read(){
    int vis=1,ans=0;
    char x=getchar();
    while(x<'0'||x>'9'){
        if(x=='-')vis=-1;
        x=getchar();
    }
    while(x>='0'&&x<='9'){
        ans=ans*10+x-'0';
        x=getchar();
    }
    return vis*ans;
}
inline void print(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)print(x/10);
    putchar(x%10+'0');
}
int n=read(),m=read(),opt,x,y;
const int N=1e5+9,Mod=1e9+7;
struct node{
	int l,r,sum,ans;
}e[N];
int b[N];
inline void putup(int p){
	e[p].sum=(e[p*2].sum+e[p*2+1].sum)%Mod;
	e[p].ans=(e[p*2].ans+e[p*2+1].ans)%Mod;
}
inline void build(int p,int l,int r){
	e[p].l=l,e[p].r=r;
	if(l==r){
		e[p].sum=b[l];
		e[p].sum=b[l]*b[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	putup(p);
}
inline void modify(int p,int x,int y){
	if(e[p].r<x||x<e[p].l)return;
	if(e[p].l==e[p].r&&e[p].l==x){
		e[p].sum=b[e[p].l];
		e[p].sum=(b[e[p].l]*b[e[p].l])%Mod;
		return;
	}
	modify(p*2,x,y);
	modify(p*2+1,x,y);
	putup(p);
}
inline int asksum(int p,int l,int r){
	if(e[p].r<l||r<e[p].l)return 0;
	if(l<=e[p].l&&e[p].r<=r)return e[p].sum;
	return (asksum(p*2,l,r)+asksum(p*2+1,l,r))%Mod;
}
inline int askans(int p,int l,int r){
	if(e[p].r<l||r<e[p].l)return 0;
	if(l<=e[p].l&&e[p].r<=r)return e[p].ans;
	return (askans(p*2,l,r)+askans(p*2+1,l,r))%Mod;
}
inline qpow(int x,int n){
	if(n==1)return x;
	int last=qpow(x,n/2)%Mod;
	if(n&1)return ((last*last)%Mod*x)%Mod;
	else return ((last*last)%Mod)%Mod;
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	for(int i=1;i<=n;i++){
		b[i]=read();
	}
	build(1,1,n);
	while(m--){
		opt=read(),x=read(),y=read();
		if(opt==1){
			b[x]=y;
			modify(1,x,y); 
		}else{
			int k=qpow(y-x+1,Mod-2),s=asksum(1,x,y)%Mod,sp=askans(1,x,y)%Mod;	
//			int tmp1 = sp % Mod * k % Mod; int tmp = s % Mod * k % Mod;
//			int ans = tmp1 - tmp * tmp % Mod;
//			ans = (ans + Mod * 3) % Mod;
			sp = sp * k % Mod; s = s % Mod * k % Mod;
			int ans = sp - s * s % Mod;
			ans = (ans + 10 * Mod) % Mod;
			print(ans),endl; 
		}
	}
    return 0;
}
2023/7/19 16:21
加载中...