分块0分QWQ
  • 板块P2357 守墓人
  • 楼主l55584
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/7/29 09:57
  • 上次更新2023/11/4 12:47:38
查看原帖
分块0分QWQ
184271
l55584楼主2021/7/29 09:57
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;const int maxn=500500;
int n,f,m;int a[maxn];ll q[maxn],la[maxn];int R[maxn],L[maxn];int tag[maxn];
void add(int l,int r,int k)
{
	if(tag[l]==tag[r])
	{
		for(int i=l;i<=r;i++) q[tag[l]]+=k,a[i]+=k;
		return;
	}
	
	for(int i=tag[i]+1;i<=tag[r]-1;i++) q[i]+=k*(R[i]-L[i]+1),la[i]+=k;
	for(int i=l;i<=R[tag[l]];i++) q[tag[i]]+=k,a[i]+=k;
	for(int i=L[tag[r]];i<=r;i++) q[tag[i]]+=k,a[i]+=k;
}
ll check(int l,int r)
{
	ll ans=0;
	if(tag[l]==tag[r])
	{
		for(int i=l;i<=r;i++) ans+=a[i]+la[tag[i]];
		return ans;
	}
	for(int i=tag[l]+1;i<=tag[r]-1;i++) ans+=q[i];
	for(int i=l;i<=R[tag[l]];i++) ans+=a[i]+la[tag[l]];
	for(int i=L[tag[r]];i<=r;i++) ans+=a[i]+la[tag[r]];
	return ans;
}
int main()
{
	cin>>n>>f;
	for(int i=1;i<=n;i++) cin>>a[i];
	m=sqrt(n);int j=0;
	for(int i=1;i<=n;i++)
	{
		if(i%m==1) L[++j]=i;
		if(i==n||i%m==0) R[j]=i;
		q[j]+=a[i];
		tag[i]=j;
	}
	int l,r,k,ty;
	for(int i=1;i<=f;i++)
	{
		cin>>ty;if(ty==1)cin>>l>>r>>k;if(ty==2||ty==3)cin>>k;if(ty==4)cin>>l>>r;
		if(ty==1) add(l,r,k);
		if(ty==2) add(1,1,k);
		if(ty==3) add(1,1,-1*k);
		if(ty==4) cout<<check(l,r)<<"\n";
		if(ty==5) cout<<check(1,1)<<"\n";
	//	for(int i=1;i<=ceil(n/m);i++) cout<<q[i]<<" ";
	//	cout<<"\n";
	}
	//for(int i=1;i<=n;i++) cout<<tag[i]<<" ";
	//for(int i=1;i<=j;i++) cout<<q[i]<<" ";
	return 0;
}

就只有37~43行和题解不一样了……

2021/7/29 09:57
加载中...