• P1438 无聊的数列


    题目

    P1438 无聊的数列

    做法

    彻底觉得自己傻了,一眼题系列都看不出o(╥﹏╥)o

    等差数列直接线段树维护一个差分数组就行了无聊的数列

    My complete code

    #include<bits/stdc++.h>
    using namespace std;
    typedef int LL;
    const LL maxn=1e6;
    LL n,nod,q,root;
    LL lazy[maxn],son[maxn][2],sum[maxn],a[maxn];
    inline void Pushdown(LL now,LL l,LL r){
    	if(!lazy[now]) return;
    	if(!son[now][0]) son[now][0]=++nod;
    	if(!son[now][1]) son[now][1]=++nod;
    	LL lc(son[now][0]),rc(son[now][1]);
    	LL val(lazy[now]),mid(l+r>>1);
    	lazy[lc]+=val,lazy[rc]+=val;
    	sum[lc]+=(mid-l+1)*val,sum[rc]+=(r-mid)*val;
    	lazy[now]=0;
    }
    void Add(LL &now,LL l,LL r,LL lt,LL rt,LL val){
    	if(!now) now=++nod;
    	if(lt<=l&&rt>=r){
    		lazy[now]+=val,
    		sum[now]+=(r-l+1)*val;
    		return;
    	}Pushdown(now,l,r);
    	LL mid(l+r>>1);
    	if(lt<=mid) Add(son[now][0],l,mid,lt,rt,val);
    	if(rt>mid) Add(son[now][1],mid+1,r,lt,rt,val);
    	sum[now]=sum[son[now][0]]+sum[son[now][1]];
    }
    LL Query(LL now,LL l,LL r,LL lt,LL rt){
    	if(!now) return 0;
    	if(lt<=l&&rt>=r) return sum[now];
    	Pushdown(now,l,r);
    	LL mid(l+r>>1),ret(0);
    	if(lt<=mid) ret+=Query(son[now][0],l,mid,lt,rt);
    	if(rt>mid) ret+=Query(son[now][1],mid+1,r,lt,rt);
    	return ret;
    }
    int main(){
    	cin>>n>>q;
    	for(LL i=1;i<=n;++i) cin>>a[i];
    	while(q--){
    		LL op; cin>>op;
    		if(op==1){
    			LL l,r,k,d;
    			cin>>l>>r>>k>>d;
    			Add(root,1,n,l,l,k);
    			if(r>l) Add(root,1,n,l+1,r,d);
    			if(r!=n) Add(root,1,n,r+1,r+1,-(k+(r-l)*d));
    		}else{
    			LL p; cin>>p;
    			cout<<Query(root,1,n,1,p)+a[p]<<endl;
    		}
    	}return 0;
    }
    
  • 相关阅读:
    BorderContainer 背景透明一不小心就解决了!
    C#编程应用线程与委托
    第二次SQL RAP要点
    最近的学习
    BW中传输的问题
    7月总结Dotnetnuke的研究总结
    EP学习要点记忆
    盲人摸象SAP PS模块的介绍与讨论
    如何跨Client删除数据
    如何修改Portal与BW系统的链接域名
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10349484.html
Copyright © 2020-2023  润新知