1 条题解

  • 0
    @ 2023-6-21 19:59:14

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long lnt;
    const int N=1E5+5,M=4E5+5;
    int s[N],mn[M],mx[M],tg[M];lnt sm[M];
    inline void update(int t) {
    	int a=t<<1,b=a|1;
    	sm[t]=sm[a]+sm[b];
    	mn[t]=min(mn[a],mn[b]);
    	mx[t]=max(mx[a],mx[b]);
    }
    void build(int t,int l,int r) {
    	if(l==r)sm[t]=mn[t]=mx[t]=s[l];
    	else{
    		int m=l+r>>1,a=t<<1,b=a|1;
    		build(b,m+1,r);
    		build(a,l,m);
    		update(t);
    	}
    }
    void add(int t,int l,int r,int x,int y,int v) {
    	if(l==x&&y==r)sm[t]+=1LL*v*(r-l+1),mx[t]+=v,mn[t]+=v,tg[t]+=v;
    	else{
    		int m=l+r>>1,a=t<<1,b=a|1;
    		if(tg[t])add(a,l,m,l,m,tg[t]),add(b,m+1,r,m+1,r,tg[t]),tg[t]=0;
    		if(y<=m)add(a,l,m,x,y,v);
    		else if(x>m)add(b,m+1,r,x,y,v);
    		else add(a,l,m,x,m,v),add(b,m+1,r,m+1,y,v);
    		update(t);
    	}
    }
    int dis(int a,int b) {
    	return (a>=0?a/b:(a-b+1)/b)-a;
    }
    void div(int t,int l,int r,int x,int y,int v) {
    	if(l==x&&y==r&&dis(mx[t],v)==dis(mn[t],v))add(t,l,r,x,y,dis(mx[t],v));
    	else{
    		int m=l+r>>1,a=t<<1,b=a|1;
    		if(tg[t])add(a,l,m,l,m,tg[t]),add(b,m+1,r,m+1,r,tg[t]),tg[t]=0;
    		if(y<=m)div(a,l,m,x,y,v);
    		else if(x>m)div(b,m+1,r,x,y,v);
    		else div(a,l,m,x,m,v),div(b,m+1,r,m+1,y,v);
    		update(t);
    	}
    }
    lnt sum(int t,int l,int r,int x,int y) {
    	if(l==x&&y==r)return sm[t];
    	int m=l+r>>1,a=t<<1,b=a|1;
    	if(tg[t])add(a,l,m,l,m,tg[t]),add(b,m+1,r,m+1,r,tg[t]),tg[t]=0;
    	if(y<=m)return sum(a,l,m,x,y);
    	if(x>m)return sum(b,m+1,r,x,y);
    	return sum(a,l,m,x,m)+sum(b,m+1,r,m+1,y);
    }
    int min(int t,int l,int r,int x,int y) {
    	if(l==x&&y==r)return mn[t];
    	int m=l+r>>1,a=t<<1,b=a|1;
    	if(tg[t])add(a,l,m,l,m,tg[t]),add(b,m+1,r,m+1,r,tg[t]),tg[t]=0;
    	if(y<=m)return min(a,l,m,x,y);
    	if(x>m)return min(b,m+1,r,x,y);
    	return min(min(a,l,m,x,m),min(b,m+1,r,m+1,y));
    }
    int n,m;
    signed main() {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i)scanf("%d",s+i);
    	build(1,1,n);
    	for(int i=1,k,x,y,z;i<=m;++i){
    		scanf("%d%d%d",&k,&x,&y),++x,++y;
    		if(k==4)printf("%lld\n",sum(1,1,n,x,y));
    		else if(k==3)printf("%d\n",min(1,1,n,x,y));
    		else if(scanf("%d",&z),k==1)add(1,1,n,x,y,z);
    		else div(1,1,n,x,y,z);
    	}
    }
    
    • 1

    信息

    ID
    1008
    时间
    2000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者