洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

洛谷P3372

 1 //线段树  询问区间和,支持区间修改
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6  struct treetype
 7  {
 8      int l,r;
 9      long long sum,d;
10  };
11 
12 const int maxn=1000010;
13 
14 treetype a[maxn<<2];
15 long long num[maxn];
16 
17 void build(int k,int l,int r)
18 {
19     a[k].l=l;a[k].r=r;a[k].d=0;
20     if (a[k].l==a[k].r)
21     {
22         a[k].sum=num[l];
23         return;
24     }
25     int mid=(l+r)>>1,i=k<<1;
26     build(i,l,mid);
27     build(i+1,mid+1,r);
28     a[k].sum=a[i].sum+a[i+1].sum;
29 }
30 void pushdown(int k)
31 {
32     if (a[k].l==a[k].r) a[k].d=0;
33     if (a[k].d==0) return;
34     //int i=k<<1;long long t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d;
35     //i++;t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d;
36     int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
37     i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
38     a[k].d=0;
39 }
40 void change(int k,int l,int r,long long d)
41 {
42     pushdown(k);
43     if (l<=a[k].l && a[k].r<=r)
44     {
45         //long long t=a[k].r-a[k].l+1;
46         a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d;
47         return;
48     }
49     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
50     if (l<=mid) change(i,l,r,d);
51     if (mid<r) change(i+1,l,r,d);
52     a[k].sum=a[i].sum+a[i+1].sum;
53 }
54 long long query(int k,int l,int r)
55 {
56     pushdown(k);
57     if (l<=a[k].l && a[k].r<=r) return a[k].sum;
58     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
59     long long ans=0;
60     if (l<=mid) ans=query(i,l,r);
61     if (mid<r) ans+=query(i+1,l,r);
62     return ans;
63 }
64 
65 int main()
66 {
67     int n,m;
68     scanf("%d%d",&n,&m);
69     for (int i=1;i<=n;i++) scanf("%lld",&num[i]);
70     build(1,1,n);
71     for (int i=1;i<=m;i++)
72     {
73         int p,x,y;
74         scanf("%d%d%d",&p,&x,&y);
75         if (p==1)
76         {
77             long long k;
78             scanf("%lld",&k);
79             change(1,x,y,k);
80         }
81         else printf("%lld\n",query(1,x,y));
82     }
83     return 0;
84 }

 

poj3468

 1 //线段树  询问区间和,支持区间修改
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6  struct treetype
 7  {
 8      int l,r;
 9      long long sum,d;
10  };
11 
12 const int maxn=100010;
13 
14 treetype a[maxn<<2];
15 long long num[maxn];
16 
17 void build(int k,int l,int r)
18 {
19     a[k].l=l;a[k].r=r;a[k].d=0;
20     if (a[k].l==a[k].r)
21     {
22         a[k].sum=num[l];
23         return;
24     }
25     int mid=(l+r)>>1,i=k<<1;
26     build(i,l,mid);
27     build(i+1,mid+1,r);
28     a[k].sum=a[i].sum+a[i+1].sum;
29 }
30 void pushdown(int k)
31 {
32     if (a[k].l==a[k].r) a[k].d=0;
33     if (a[k].d==0) return;
34     int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
35     i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
36     a[k].d=0;
37 }
38 void change(int k,int l,int r,long long d)
39 {
40     pushdown(k);
41     if (l<=a[k].l && a[k].r<=r)
42     {
43         a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d;
44         return;
45     }
46     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
47     if (l<=mid) change(i,l,r,d);
48     if (mid<r) change(i+1,l,r,d);
49     a[k].sum=a[i].sum+a[i+1].sum;
50 }
51 long long query(int k,int l,int r)
52 {
53     pushdown(k);
54     if (l<=a[k].l && a[k].r<=r) return a[k].sum;
55     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
56     long long ans=0;
57     if (l<=mid) ans=query(i,l,r);
58     if (mid<r) ans+=query(i+1,l,r);
59     return ans;
60 }
61 
62 int main()
63 {
64     int n,m;
65     scanf("%d%d",&n,&m);
66     for (int i=1;i<=n;i++) scanf("%lld",&num[i]);
67     build(1,1,n);
68     for (int i=1;i<=m;i++)
69     {
70         char p;scanf("%c",&p);
71         int x,y;
72         scanf("%c%d%d",&p,&x,&y);
73         if (p=='C')
74         {
75             long long k;
76             scanf("%lld",&k);
77             change(1,x,y,k);
78         }
79         else printf("%lld\n",query(1,x,y));
80     }
81     return 0;
82 }

 

posted @ 2019-07-30 16:19  Klaier  阅读(141)  评论(0编辑  收藏  举报