牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?

 

牛客小白月赛5

 

I.区间 (interval)


休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢???

试了一晚上,找出来了,多初始化了add标记数组或者将add标记数组定义为long long型就会超内存,并不是自己的线段树写的有问题,而是出题人故意想卡线段树,就是不想让人家用线段树过这道题,但是还是有很多人用线段树过了,我最后删了add标记数组的初始化就过了,mdzz。。。

这道题还要记得开long long,其他的就没了,差分数组的没写,线段树的水过去就过去吧。

 只是水一下博客。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<map>
 9 using namespace std;
10 typedef long long ll;
11 const int maxn=1e6+10;
12 const int inf=0x3f3f3f3f;
13 #define lson l,m,rt<<1
14 #define rson m+1,r,rt<<1|1
15 ll tree[maxn<<2],add[maxn<<2];
16 
17 void pushup(int rt)
18 {
19     tree[rt]=tree[rt<<1]+tree[rt<<1|1];
20 }
21 void pushdown(int rt,int m)
22 {
23     if(add[rt]){
24         add[rt<<1]+=add[rt];
25         add[rt<<1|1]+=add[rt];
26         tree[rt<<1]+=(1ll)*(m-(m>>1))*add[rt];
27         tree[rt<<1|1]+=(1ll)*(m>>1)*add[rt];
28         add[rt]=0;
29     }
30 }
31 void build(int l,int r,int rt)
32 {
33     if(l==r){
34         scanf("%lld",&tree[rt]);
35         return ;
36     }
37 
38     int m=(l+r)>>1;
39     build(lson);
40     build(rson);
41     pushup(rt);
42 }
43 void update(int L,int R,int c,int l,int r,int rt)
44 {
45     if(L<=l&&r<=R){
46         add[rt]+=c;
47         tree[rt]+=(1ll)*c*(r-l+1);
48         return ;
49     }
50 
51     pushdown(rt,r-l+1);
52     int m=(l+r)>>1;
53     if(L<=m) update(L,R,c,lson);
54     if(R> m) update(L,R,c,rson);
55     pushup(rt);
56 }
57 ll query(int L,int R,int l,int r,int rt)
58 {
59     if(L<=l&&r<=R){
60         return tree[rt];
61     }
62 
63     pushdown(rt,r-l+1);
64     int m=(l+r)>>1;
65     ll ret=0;
66     if(L<=m)ret+=query(L,R,lson);
67     if(R> m)ret+=query(L,R,rson);
68     return ret;
69 }
70 int main()
71 {
72     int n,m;
73     scanf("%d%d",&n,&m);
74     build(1,n,1);
75     int op,l,r,v;
76     for(int i=0;i<m;i++){
77         scanf("%d%d%d%d",&op,&l,&r,&v);
78         if(op==1){
79             update(l,r,-v,1,n,1);
80         }
81         else{
82             update(l,r,v,1,n,1);
83         }
84     }
85     int L,R;
86     scanf("%d%d",&L,&R);
87     printf("%lld\n",query(L,R,1,n,1));
88     return 0;
89 }

 

 

 

 

 

 

溜了。。。

 

posted @ 2018-07-24 20:13  ZERO-  阅读(365)  评论(0编辑  收藏  举报