首页 > 其他 > 详细

线段树

时间:2020-07-25 21:31:34      阅读:61      评论:0      收藏:0      [点我收藏+]

1.无聊的数列

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 inline int read()
 4 {
 5     int x=0,f=1;char c=getchar();
 6     if(c==-) f=-1;
 7     for(;!isdigit(c);c=getchar()) if(c==-) f=-1;
 8     for(;isdigit(c);c=getchar()) x=x*10+c-0;
 9     return x*f; 
10 }
11 const int N=100005;
12 int ans,q;
13 int ll,rr,aa1,dd;
14 struct node
15 {
16     int l,r,w,a1,d;
17 }tree[N*4+5];
18 inline void build(int l,int r,int k)
19 {
20     tree[k].l=l;tree[k].r=r;
21     if(l==r)
22     {
23         tree[k].w=read();
24         return;
25     }
26     int mid=l+r>>1;
27     build(l,mid,k*2);
28     build(mid+1,r,k*2+1);
29     tree[k].w=tree[k*2].w+tree[k*2+1].w;
30 }
31 inline void dowm(int k)
32 {
33     int nn=tree[k*2].r-tree[k*2].l+1;
34     int mm=tree[k*2+1].r-tree[k*2+1].l+1;
35     tree[k*2].a1+=tree[k].a1;
36     tree[k*2+1].a1+=tree[k].a1+nn*tree[k].d;
37     tree[k*2].d+=tree[k].d;
38     tree[k*2+1].d+=tree[k].d;
39     tree[k*2].w+=tree[k].a1*nn+nn*(nn-1)/2*tree[k].d;
40     tree[k*2+1].w+=(tree[k].a1+nn*tree[k].d)*mm+mm*(mm-1)/2*tree[k].d;
41     tree[k].a1=0;
42     tree[k].d=0;
43 }
44 inline void add(int k)
45 {
46     int l=tree[k].l;int r=tree[k].r;
47     if(l>=ll&&r<=rr)
48     {
49         tree[k].a1+=aa1+(l-ll)*dd;
50         tree[k].d+=dd;
51         tree[k].w+=(aa1+(l-ll)*dd)*(r-l+1)+(r-l+1)*(r-l)/2*dd;
52         return;
53     }
54     dowm(k);
55     int mid=l+r>>1;
56     if(mid>=ll) add(k*2);
57     if(mid<rr) add(k*2+1);
58     tree[k].w=tree[k*2].w+tree[k*2+1].w;
59 }
60 inline void ask(int k)
61 {
62     int l=tree[k].l;int r=tree[k].r;
63     if(l==q&&r==q)
64     {
65         ans=tree[k].w;
66         return;
67     }
68     dowm(k);
69     int mid=l+r>>1;
70     if(mid>=q) ask(k*2);
71     if(mid<q) ask(k*2+1);
72 }
73 int main()
74 {
75     int n,m;
76     n=read();m=read();
77     build(1,n,1);
78     while(m--)
79     {
80         int opt=read();
81         if(opt==1)
82         {
83             
84             ll=read();rr=read();aa1=read();dd=read();
85             add(1);
86         }
87         if(opt==2)
88         {
89             q=read();
90             ask(1);
91             printf("%d\n",ans);
92         }
93     }
94     return 0;
95 } 
View Code

 

线段树

原文:https://www.cnblogs.com/SuSuSOS/p/13376965.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!