能过样例却爆零蒟蒻求助
  • 板块P2122 还教室
  • 楼主B_1168
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/6/13 00:24
  • 上次更新2023/11/7 00:46:35
查看原帖
能过样例却爆零蒟蒻求助
62562
B_1168楼主2020/6/13 00:24

代码如下,本代码修改前已通过P1471

//ref: https://www.luogu.com.cn/blog/_post/104810
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;

long long a[maxn],val_sum[maxn],val_sqr[maxn],add[maxn];

long long be[maxn],n,m,len;

void print(long long l,long long r){
	if(l==0){
		printf("0/1\n");
		return;
	}
	long long temp=__gcd(l,r);
	printf("%lld/%lld\n",l/temp,r/temp);
} 

void modify(long long from,long long to,long long ad){
    for(long long i=from;i<=min(to,be[from]*len);i++) val_sqr[be[i]]+=2*a[i]*ad+ad*ad,a[i]+=ad,val_sum[be[i]]+=ad;
    if(be[from]!=be[to]){
        for(long long i=(be[to]-1)*len+1;i<=to;i++) val_sqr[be[i]]+=2*a[i]*ad+ad*ad,a[i]+=ad,val_sum[be[i]]+=ad;
    }
    for(long long i=be[from]+1;i<=be[to]-1;i++) add[i]+=ad;
}

long long query_sum(long long from,long long to,int fl){
	long long cnt=0;
	for(long long i=from;i<=min(to,be[from]*len);i++) cnt+=(a[i]+add[be[i]]);
	if(be[from]!=be[to]){
        for(long long i=(be[to]-1)*len+1;i<=to;i++) cnt+=(a[i]+add[be[i]]);
    }
    for(long long i=be[from]+1;i<=be[to]-1;i++) cnt+=(val_sum[i]+add[i]*len);
	if(fl)print(cnt,to-from+1);
	return cnt;
}

void query_sqr(long long from,long long to){
	long long cnt=0, avg=query_sum(from,to,0);
	for(long long i=from;i<=min(to,be[from]*len);i++) cnt+=(a[i]+add[be[i]])*(a[i]+add[be[i]]);
	if(be[from]!=be[to]){
        for(long long i=(be[to]-1)*len+1;i<=to;i++) cnt+=(a[i]+add[be[i]])*(a[i]+add[be[i]]);
    }
    for(long long i=be[from]+1;i<=be[to]-1;i++) cnt+=val_sqr[i]+2*val_sum[i]*add[i]+len*add[i]*add[i];
    print(cnt*(to-from+1)-avg*avg,(to-from+1)*(to-from+1));
}

int main(){
	scanf("%d%d",&n,&m);
	len=sqrt(n);
    for(long long i=1;i<=n;i++) be[i]=(i-1)/len+1;
    for(long long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        val_sum[be[i]]+=a[i];
        val_sqr[be[i]]+=a[i]*a[i];
    }
    while(m--){
    	long long op,l,r;
    	scanf("%d",&op);
    	if(op==1){
    		long long d;
    		scanf("%d%d%lld",&l,&r,&d);
    		modify(l,r,d);
    	}
    	if(op==2){
    		scanf("%d%d",&l,&r);
    		query_sum(l,r,1);
    	}
    	if(op==3){
    		scanf("%d%d",&l,&r);
    		query_sqr(l,r);
    	}
    }
} 
2020/6/13 00:24
加载中...