分块爆0求助
  • 板块P2357 守墓人
  • 楼主Svemit
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/12/25 11:44
  • 上次更新2023/10/24 06:41:28
查看原帖
分块爆0求助
503792
Svemit楼主2022/12/25 11:44
#include<bits/stdc++.h>
#define PII pair<int,int>
#define PLL pair<long long,long long>
#define mkp() make_pair()
#define pbk() push_back()
#define umap unordered_map
#define ls (x<<1)
#define rs (x<<1|1)
#define lson l,mid,x<<1
#define rson mid+1,r,x<<1|1
#define lowbit(x) x&(-x)
#define debug() cout<<"$\n"
typedef long long ll;
const int N=2e5+5,INF=0x3f3f3f3f;
using namespace std;
int read()
{
    int f=1,x=0;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    return f*x;
}
void write(int x)
{
  if(x<0)
  putchar('-'),x=-x;
  if(x>9) write(x/10);
  putchar(x%10+'0');
}
void print(int x)
{
	write(x);
	putchar('\n');
}
int n,m;
ll belong[N],st[N],ed[N],tag[N];
ll a[N],sum[N];

void init()
{
	int cnt=sqrt(n*1.0);
	int num=n/cnt;
	if(n%cnt) num++;
	for(int i=1;i<=num;i++)
	{
		st[i]=(i-1)*cnt+1;
		ed[i]=i*cnt;
	}
	ed[num]=n;
	for(int i=1;i<=num;i++)
	{
		for(int j=st[i];j<=ed[i];j++)
		{
			sum[i]+=a[j];
			belong[j]=i;
		}
	}
}

void update(int l,int r,int k)
{
	int p=belong[l],q=belong[r];
	if(p==q)
	{
		sum[q]+=(r-l+1)*k;
		for(int i=l;i<=r;i++)
		  a[i]+=k;
	}
	else
	{
		for(int i=l;i<=ed[p];i++)
		  a[i]+=k;
		sum[p]+=(ed[p]-l+1)*k;
		
		for(int i=p+1;i<=q-1;i++)
		  tag[i]+=k;
		
		for(int i=st[q];i<=r;i++)
		  a[i]+=k;
		sum[q]+=(r-st[q]+1)*k; 
	}
}

ll query(int l,int r)
{
	ll res=0;
	int p=belong[l],q=belong[r];
	if(p==q)
	{
		for(int i=l;i<=r;i++)
		  res+=a[i];
		res+=(r-l+1)*tag[p];
	}
	else
	{
		for(int i=l;i<=ed[p];i++)
		  res+=a[i];
		res+=(ed[p]-l+1)*tag[p];
		
		for(int i=p+1;i<=q-1;i++)
		  res+=sum[i]+(ed[i]-st[i]+1)*tag[i];
		  
		for(int i=st[q];i<=r;i++)
		  res+=a[i];
		res+=(r-st[q]+1)*tag[p];
	}
	return res;
}

int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
      a[i]=read();
    init();
    while(m--)
    {
    	int op=read();
    	if(op==1)
    	{
    		int l=read(),r=read(),k=read();
    		update(l,r,k);
		}
		if(op==2)
		{
			int k=read();
			update(1,1,k);
		}
		if(op==3)
		{
			int k=read();
			update(1,1,-k);
		}
		if(op==4)
		{
			int l=read(),r=read();
			print(query(l,r));
		}
		if(op==5)
		  print(query(1,1));
	}
	return 0;
}


2022/12/25 11:44
加载中...