• 【BZOJ1798】【AHOI2009】维护序列(线段树)


    题目链接

    题解

    这不就是luogu的线段树2的板子吗。。。。
    没有任何的区别。。。
    上代码吧。。。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    using namespace std;
    #define ll long long
    #define lson (now<<1)
    #define rson (now<<1|1)
    #define MAX 200000
    int a[MAX];
    int P,N,M;
    inline ll read()
    {
    	ll x=0,t=1;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=-1,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return x*t;
    }
    struct Node
    {
    	ll val,lc,lj;
    }t[MAX*5];
    void Build(int now,int l,int r)
    {
    	t[now].lc=1;t[now].lj=0;
    	if(l==r){t[now].val=a[l]%P;return;}
    	int mid=(l+r)>>1;
    	Build(lson,l,mid);
    	Build(rson,mid+1,r);
    	t[now].val=(t[lson].val+t[rson].val)%P;
    }
    void Pushdown(int now,int l,int r)
    {
    	int mid=(l+r)>>1;
    	int lsize=mid-l+1,rsize=r-mid;
    	t[lson].val=(t[lson].val*t[now].lc+t[now].lj*lsize)%P;
    	t[rson].val=(t[rson].val*t[now].lc+t[now].lj*rsize)%P;
    	t[lson].lc=t[lson].lc*t[now].lc%P;
    	t[rson].lc=t[rson].lc*t[now].lc%P;
    	t[lson].lj=(t[lson].lj*t[now].lc+t[now].lj)%P;
    	t[rson].lj=(t[rson].lj*t[now].lc+t[now].lj)%P;
    	t[now].lc=1;t[now].lj=0;
    }
    void Plus(int now,int l,int r,int al,int ar,ll pp)
    {
    	if(al==l&&ar==r)
    	{
    		t[now].lj=(t[now].lj+pp)%P;
    		t[now].val=(t[now].val+(r-l+1)*pp)%P;
    		return;
    	}
    	Pushdown(now,l,r);
    	int mid=(l+r)>>1;
    	if(ar<=mid)Plus(lson,l,mid,al,ar,pp);
    	else if(al>mid)Plus(rson,mid+1,r,al,ar,pp);
    	else {Plus(lson,l,mid,al,mid,pp);Plus(rson,mid+1,r,mid+1,ar,pp);}
    	t[now].val=(t[lson].val+t[rson].val)%P;
    }
    void Multi(int now,int l,int r,int al,int ar,ll pp)
    {
    	if(al==l&&ar==r)
    	{
    		t[now].val=(t[now].val*pp)%P;
    		t[now].lj=(t[now].lj*pp)%P;
    		t[now].lc=(t[now].lc*pp)%P;
    		return;
    	}
    	Pushdown(now,l,r);
    	int mid=(l+r)>>1;
    	if(ar<=mid)Multi(lson,l,mid,al,ar,pp);
    	else if(al>mid)Multi(rson,mid+1,r,al,ar,pp);
    	else {Multi(lson,l,mid,al,mid,pp);Multi(rson,mid+1,r,mid+1,ar,pp);}
    	t[now].val=(t[lson].val+t[rson].val)%P;
    }
    ll Query(int now,int l,int r,int al,int ar)
    {
    	if(al==l&&ar==r)return t[now].val%P;
    	Pushdown(now,l,r);
    	int mid=(l+r)>>1;
    	ll re=0;
    	if(ar<=mid)re=Query(lson,l,mid,al,ar)%P;
    	else if(al>mid)re=Query(rson,mid+1,r,al,ar)%P;
    	else re=(Query(lson,l,mid,al,mid)+Query(rson,mid+1,r,mid+1,ar))%P;
    	t[now].val=(t[lson].val+t[rson].val)%P;
    	return re%P;
    }
    int main()
    {
    	N=read();P=read();
    	for(int i=1;i<=N;++i)a[i]=read();
    	Build(1,1,N);
    	M=read();
    	while(M--)
    	{
    		int opt=read();int x=read();int y=read();
    		if(opt==1)
    		{
    			ll k=read();
    			Multi(1,1,N,x,y,k);
    		}
    		if(opt==2)
    		{
    			ll k=read();
    			Plus(1,1,N,x,y,k);
    		}
    		if(opt==3)
    		{
    			printf("%lld
    ",Query(1,1,N,x,y)%P);
    		}
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    linux 下常用命令
    Mysql 数据库几种引擎的区别比较
    java 中使用ajax调用后台方法注意事项
    C# HtmlDocument和HtmlNode的使用以及节点的模糊查询
    Visio 保存卡死解决办法
    java outterLoop跳出多重循环用法以及详解
    webapi 文件下载输出接口
    获取web.config 内的值
    xml的读取(曾删改)
    from 验证
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7623989.html
Copyright © 2020-2023  润新知