线段树+等差数列

题目链接:https://ac.nowcoder.com/acm/contest/5157/C

 

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define mod 111546435
 4 #define inv 55773218
 5  
 6 const int MAXN=200000+10;
 7 struct node{
 8     int l,r;
 9     long long a,d;
10     long long val;
11 }tree[MAXN<<2];
12 long long arr[MAXN];
13 int n,q;
14  
15 void build(int pos,int l,int r){
16     tree[pos].l=l,tree[pos].r=r;
17     if(l==r){
18         tree[pos].val=arr[l];
19         return;
20     }
21     int mid=l+r>>1;
22     build(pos<<1,l,mid);
23     build(pos<<1|1,mid+1,r);
24     tree[pos].val=(tree[pos<<1].val+tree[pos<<1|1].val)%mod;
25 }
26  
27 inline void pushdown(int pos){
28     long long a=tree[pos].a;
29     long long d=tree[pos].d;
30     if(!a&&!d)return;
31     long long e=a+(tree[pos<<1].r-tree[pos<<1].l)*d;
32     tree[pos<<1].val=(tree[pos<<1].val+(a+e)%mod*(tree[pos<<1].r-tree[pos<<1].l+1)%mod*inv)%mod;
33     tree[pos<<1].a=(tree[pos<<1].a+a)%mod;
34     tree[pos<<1].d=(tree[pos<<1].d+d)%mod;
35     a=(tree[pos<<1|1].l-tree[pos<<1].l)*d+a;
36     e=(tree[pos<<1|1].r-tree[pos<<1|1].l)*d+a;
37     tree[pos<<1|1].val=(tree[pos<<1|1].val+(a+e)%mod*(tree[pos<<1|1].r-tree[pos<<1|1].l+1)%mod*inv)%mod;
38     tree[pos<<1|1].a=(tree[pos<<1|1].a+a)%mod;
39     tree[pos<<1|1].d=(tree[pos<<1|1].d+d)%mod;
40     tree[pos].a=tree[pos].d=0;
41 }
42  
43 void update(int pos,long long a,long long d,int l,int r){
44     if(tree[pos].l>=l&&tree[pos].r<=r){
45         long long s=a+(tree[pos].l-l)*d;
46         long long e=a+(tree[pos].r-l)*d;
47         tree[pos].val=(tree[pos].val+(s+e)%mod*(tree[pos].r-tree[pos].l+1)%mod*inv)%mod;
48         tree[pos].a=(tree[pos].a+s)%mod;
49         tree[pos].d=(tree[pos].d+d)%mod;
50         return;
51     }
52     pushdown(pos);
53     int mid=tree[pos].l+tree[pos].r>>1;
54     if(mid>=l)update(pos<<1,a,d,l,r);
55     if(mid<r)update(pos<<1|1,a,d,l,r);
56     tree[pos].val=(tree[pos<<1].val+tree[pos<<1|1].val)%mod;
57 }
58  
59 long long query(int pos,int l,int r){
60     if(tree[pos].l>=l&&tree[pos].r<=r)return tree[pos].val;
61     pushdown(pos);
62     tree[pos].val=(tree[pos<<1].val+tree[pos<<1|1].val)%mod;
63     int mid=tree[pos].l+tree[pos].r>>1;
64     long long ans=0;
65     if(mid>=l)ans+=query(pos<<1,l,r);
66     if(mid<r)ans+=query(pos<<1|1,l,r);
67     return ans%mod;
68 }
69  
70 int main(){
71     scanf("%d",&n);
72     for(int i=1;i<=n;i++)scanf("%lld",arr+i);
73     build(1,1,n);
74     scanf("%d",&q);
75     while(q--){
76         int p;
77         scanf("%d",&p);
78         if(p==1){
79             int l,r;
80             long long a,d;
81             scanf("%d%d%lld%lld",&l,&r,&a,&d);
82             update(1,a,d,l,r);
83         }else{
84             int l,r;
85             long long m;
86             scanf("%d%d%lld",&l,&r,&m);
87             printf("%lld\n",query(1,l,r)%m);
88         }
89     }
90     return 0;
91 }
View Code

 

posted @ 2020-08-22 12:38  古比  阅读(159)  评论(0编辑  收藏  举报