样例过了但是0分
查看原帖
样例过了但是0分
540757
wangyihao0411楼主2024/7/8 20:28

样例过了但是0分 20WA,1TLE 代码如下

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m;
int a[N],bl[N],br[N],bn,sum[N],put[N];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	bn=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
		sum[i/bn+1]+=a[i];
		if(i%bn==1)
		{
			bl[i/bn+1]=i;
		}
		if(i%bn==0)
		{
			br[i/bn+1]=i;
		}
	}
	if(bn*bn!=n)
	{
		br[bn+1]=n;
	}
	for(int i=1;i<=m;i++)
	{
		int wh;
		cin >> wh;
		if(wh==1)
		{
			int l,r,k;
			cin >> l >> r >> k;
			int lb=l/bn;
			if(l%bn!=0)
			{
				lb++;
			}
			int rb=r/bn;
			for(int i=l;i<=br[rb-1];i++)
			{
				a[i]+=k;
			}
			for(int i=lb;i<=rb;i++)
			{
				put[i]+=k;
			}
			for(int i=bl[lb+1];i<=r;i++)
			{
				a[i]+=k;
			}
		}
		if(wh==2||wh==3)
		{
			int k;
			cin >> k;
			if(wh==2)
			{
				a[1]+=k;
			}
			else
			{
				a[1]-=k;
			}
		}
		if(wh==4)
		{
			int l,r,ans=0;
			cin >> l >> r;
			int lb=l/bn;
			if(l%bn!=0)
			{
				lb++;
			}
			int rb=r/bn;
			if(r%bn!=0)
			for(int i=l;i<=br[rb-1];i++)
			{
				ans=ans+a[i]+put[lb-1];
			}
			for(int i=lb;i<=rb;i++)
			{
				ans=ans+put[i]*bn+sum[i];
			}
			for(int i=bl[lb+1];i<=r;i++)
			{
				ans=ans+a[i]+put[rb+1];
			}
			cout << ans << endl;
		}
		if(wh==5)
		{
			cout << a[1]+put[1] << endl;	
		}
	}
    return 0;
}
2024/7/8 20:28
加载中...