建议加强数据
查看原帖
建议加强数据
661094
liyifan202201楼主2024/11/20 09:49

二阶差分O(1),暴力找前缀O(n) 代码:

#include <bits/stdc++.h>
#define L long long 
#define F(a,b) for(a=1;a<=b;a++)
using namespace std;
L a[1<<20],s[1<<20],n,q,l,r,K,D;
void qj(L l,L r,L w){
	s[l]+=w,s[r+1]-=w;
}
int main(){
	cin>>n>>q;
	F(K,n) cin>>a[K];
	F(n,q){
		cin>>l;
		if(l==1){
			cin>>l>>r>>K>>D;
				qj(l,l,K);qj(l+1,r,D);qj(r+1,r+1,(l-r)*D-K);
		}
		else{
			D=0;
			cin>>l;
			F(r,l)
				D+=s[r]*(l-r+1);
			cout<<D+a[l]<<'\n';
		}
	}
}

随便卡,make data:

cout<<"100000 100000\n";
for(int i=1;i<=100000;i++)
  cout<<114<<' ';
for(int i=1;i<=100000;i++)
  cout<<'\n'<<2<<' '<<n;

不加强,搞个极端的 hack 也行

2024/11/20 09:49
加载中...