求优化方法
  • 板块学术版
  • 楼主mushroom_knight
  • 当前回复41
  • 已保存回复41
  • 发布时间2020/6/6 20:51
  • 上次更新2023/11/7 01:05:03
查看原帖
求优化方法
338786
mushroom_knight楼主2020/6/6 20:51

RT ,我调了特别久的树状数组。

用了一些dalao教的操作去做区间查询(线段树1),洛谷过了,但是学校OJ过不了(快读试过了)

(红圈框起来的是本人的提交记录)

就是这种毒瘤数据让我TLE

CODE:

#include<bits/stdc++.h>
using namespace std;
long long a[100001];
long long T_1[100001];
long long T_2[100001];
long long n,m;
long long lowbit(long long i){
	return i&-i;
}
void modify(long long *T,long long x,long long y){
	for(register long long i=x;i<=n;i+=lowbit(i)){
		T[i]+=y;
	}
}
long long find(long long *T,long long x){
	long long ans=0;
	for(register long long i=x;i;i-=lowbit(i)){
		ans+=T[i];
	}
	return ans;
}
long long query(int i){
	return 1ll*(i+1)*find(T_1,i)-find(T_2,i);
}
int cmd,x,y,k;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(register long long i=1;i<=n;++i){
		cin>>a[i]; 
		modify(T_1,i,a[i]-a[i-1]);
		modify(T_2,i,1ll*i*(a[i]-a[i-1]));
    }
	for(register long long i=1;i<=m;++i){
		cin>>cmd;
		if(cmd==1){
			cin>>x>>y>>k;
			modify(T_1,x,k);
			modify(T_1,y+1,-k);
			modify(T_2,x,1ll*x*k);
			modify(T_2,y+1,1ll*-(y+1)*k);
		} 
		else{
			cin>>x>>y;
			cout<<(query(y)-query(x-1))<<endl;
		}
	}
	return 0;
}
2020/6/6 20:51
加载中...