zoukankan      html  css  js  c++  java
  • 【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;
    }
    
    
  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7623989.html
Copyright © 2011-2022 走看看