请求调教
  • 板块P10516 数据结构
  • 楼主lcycl
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/7/20 16:46
  • 上次更新2025/7/20 17:14:11
查看原帖
请求调教
1079531
lcycl楼主2025/7/20 16:46

20pts AC #1 #6 #7 #8

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+1;
struct tree{
	int add,mul,l,r;
}t[4*N];
int n,m,a[N],b[N],x,y,le,ri,k,t1,id,ii;
void down(int po){
	t[po].add=t[po*2].add+t[po*2+1].add;
	t[po].mul=min(t[po*2].mul,t[po*2+1].mul);
}
void build(int l,int r,int po){
	t[po].l=l,t[po].r=r;
	if(l==r){
		t[po].add=a[l]+b[l];
		t[po].mul=a[l]*b[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,po*2);
	build(mid+1,r,po*2+1);
	down(po);
}
void p1(int l,int r,int kk,int tt,int po){
	if(t[po].mul>kk) return ;
	if(t[po].l==t[po].r){
		a[t[po].l]+=tt;
		b[t[po].l]+=tt;
		t[po].add=a[t[po].l]+b[t[po].l];
		t[po].mul=a[t[po].l]*b[t[po].l];
		return ;
	}
	int mid=(t[po].l+t[po].r)/2;
	if(l<=mid) p1(l,mid,kk,tt,po*2);
	if(r>mid) p1(mid+1,r,kk,tt,po*2+1);
	down(po);
}
void p2(int idd,int xx,int yy,int po){
	if(t[po].r==t[po].l){
		a[idd]=xx;
		b[idd]=yy;
		t[po].add=a[idd]+b[idd];
		t[po].mul=a[idd]*b[idd];
		return ;
	}
	int mid=(t[po].l+t[po].r)/2;
	if(idd<=mid) p2(idd,xx,yy,po*2);
	if(idd>mid) p2(idd,xx,yy,po*2+1);
	down(po);
}
int p3(int l,int r,int po){
	if(t[po].r<l||t[po].l>r) return 0;
	if(t[po].l>=l&&t[po].r<=r){
		return t[po].add;
	}
	int ans=0;
	int mid=(t[po].l+t[po].r)/2;
	ans+=p3(l,r,po*2);
	ans+=p3(l,r,po*2+1);
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		cin>>id;
		if(id==1){
			cin>>le>>ri>>k>>t1;
			if(t1)p1(le,ri,k,t1,1);
		}
		if(id==2){
			cin>>ii>>x>>y;
			p2(ii,x,y,1);
		}
		if(id==3){
			cin>>le>>ri;
			cout<<p3(le,ri,1)<<"\n";
		}
	}
	return 0;
}
2025/7/20 16:46
加载中...