站外题,分块模板,除了样例全WA,悬关
  • 板块学术版
  • 楼主017_007
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/7/15 20:44
  • 上次更新2023/11/3 09:38:38
查看原帖
站外题,分块模板,除了样例全WA,悬关
931707
017_007楼主2023/7/15 20:44

题目

Code:

#include<bits/stdc++.h>

#define reg register

using namespace std;

const int N = 5e4+10;

int n,len,qs,pos[N],l[310],r[310],a[N],add[310];
int op,x,y,c;

void Add(int zl,int zr,int v) {
	if (pos[zl]==pos[zr]) {
		for (reg int i=zl;i<=zr;++i) a[i]+=v;
		return;
	} 
	for (reg int i=zl;i<=l[pos[zl]];++i) a[i]+=v;
	for (reg int i=pos[zl]+1;i<pos[zr];++i) add[i]+=v;
	for (reg int i=l[pos[zr]];i<=zr;++i) a[i]+=v;
	return;
}

int main(){
	scanf("%d",&n);
	for (reg int i=1;i<=n;++i) scanf("%d",&a[i]);
	len=sqrt(n);
	for (reg int i=1;i<=len;++i) l[i]=r[i-1]+1,r[i]=l[i]+len-1;
	if (len*len<n) qs=len+1,l[qs]=r[len]+1,r[qs]=n;
	for (reg int i=1;i<=qs;++i) {
		for (reg int j=l[i];j<=r[i];++j) pos[j]=i;
	}
	for (reg int i=1;i<=n;++i) {
		scanf("%d %d %d %d",&op,&x,&y,&c);
		if (op==0) Add(x,y,c);
		else printf("%d\n",a[y]+add[pos[y]]);
	}
	return 0;
}
2023/7/15 20:44
加载中...