线段树维护区间覆盖等差数列,tle在第6个是为什么呀,大佬能帮我看看吗
查看原帖
线段树维护区间覆盖等差数列,tle在第6个是为什么呀,大佬能帮我看看吗
550699
commomz楼主2024/3/18 23:36
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int>p2;
const int N=3e5+10;
const int mod=1e9+7;
ll a[N];
int pos[N];
set<int>s;
struct info{
	ll sum;
	info(){
	};
	info(ll s):sum(s){
	};
};

struct tag{
    ll first,deta;
};
struct Node{
	int l,r;
	info val;
	tag t;
}seg[4*N];
info operator +(const info&l,const info&r){
	info a;
	a.sum=(l.sum+r.sum);
	return a;
}
ll calc(int u,ll first,ll deta){
    return (first+first+(seg[u].r-seg[u].l)*deta)*(seg[u].r-seg[u].l+1)/2;
}
void settag(int u,tag t){
    seg[u].val.sum=calc(u,t.first,t.deta);
    seg[u].t=t;
}
void pushup(int u){
	seg[u].val=seg[u<<1].val+seg[u<<1|1].val;
}
void pushdown(int u){
	if(seg[u].t.deta!=0){
		settag(u*2,seg[u].t);
		settag(u*2+1,seg[u].t);
		seg[u].t.deta=0;
	
	}
}
void build(int u,int l,int r){
	seg[u].l=l,seg[u].r=r;
	if(l==r){
	       if(a[l])	seg[u].val=info(0);
	       else{
	            auto it=lower_bound(s.begin(),s.end(),l),L=it,R=it;
                L--;
                int x=*L,y=*R;
                seg[u].val=info(a[x]*(y-l));
	       }
		return;
	}
	else{
		int mid=(l+r)>>1;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	} 

}
void modify(int u,int l,int r,tag d){
    if(l>r) return ;
	if(seg[u].l>=l  && seg[u].r<=r){
		settag(u,d);
		return;
	}
	else{
		pushdown(u);
		int mid=(seg[u].l+seg[u].r)>>1;
		if(r<=mid ) modify(u<<1,l,r,d);
		else if(l>mid) modify(u<<1|1,l,r,d);
		else{
		 modify(u<<1,l,r,d);
		 ll first=d.first,deta=d.deta;
		 tag t1;
		 t1.first=first+deta*(mid-seg[u].l);
		 t1.deta=d.deta;
		 modify(u<<1|1,l,r,t1); 
		}
		pushup(u);
	}
}
info query(int u,int ql,int qr){
	if(ql<=seg[u].l && qr>=seg[u].r) return seg[u].val;
	pushdown(u);
	int mid=(seg[u].l+seg[u].r)>>1;
	if(qr<=mid ) return query(u<<1,ql,qr);
	else if(ql>mid) return query(u<<1|1,ql,qr);
	else return query(u<<1,ql,qr)+query(u<<1|1,ql,qr);
}

int main()
{
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=m;i++) {
        scanf("%d",&pos[i]);
        s.insert(pos[i]);
    }
    for(int i=1;i<=m;i++) {
        int x;
        scanf("%d",&x);
        a[pos[i]]=x;
    }
    build(1,1,n);
    while(q--){
        int op;
        scanf("%d",&op);
        if(op==1){
            int x,v;
            scanf("%d%d",&x,&v);
            auto it=lower_bound(s.begin(),s.end(),x),L=it,R=it;
            L--;
            int l=*L,r=*R;
            modify(1,l+1,x-1,{a[l]*(x-l-1),-a[l]});
            modify(1,x+1,r-1,{v*(r-x-1),-v});
            modify(1,x,x,{0,0});
         
        }else{
            int l,r;
            scanf("%d%d",&l,&r);
            printf("%lld\n",query(1,l,r).sum);
        }
    }
		
    return 0;
}

2024/3/18 23:36
加载中...