poj 3468 A Simple Problem with Integers

今天的难度又增加了,在好不容易把练习A了以后,才发现,昨天的题根本就不叫题,我一口气刷得就剩一题了。只能说,攻克变态题的方法,就是去做更变态的题,然后原来的题就不变态了……

今天的作业,我的收获是,change、pushdown等涉及数据的函数的关键内容,是要随题目变化的。

 1 #include <stdio.h>
 2 const int N = 100005;
 3 long long sum[4*N];
 4 long long add[4*N];
 5 int D;
 6 void update(int cur)
 7 {
 8     sum[cur] = sum[cur<<1] + sum[cur<<1|1];
 9 }
10 void pushdown(int cur, int x, int y)
11 {
12     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
13     if(add[cur])
14     {
15         add[lc] += add[cur];
16         add[rc] += add[cur];
17         sum[lc] += add[cur] *(mid-x+1);
18         sum[rc] += add[cur] *(y - mid);
19         add[cur] = 0;
20     }
21 }
22 void build(int cur,int x,int y)
23 {
24     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
25     if(x == y)
26     {
27         add[cur] = 0;
28         return ;
29     }
30     build(lc,x,mid);
31     build(rc,mid+1,y);
32     update(cur);
33 }
34 void query(int cur,int x,int y,int s,int t,long long & ans)
35 {
36     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
37     if(x >= s && y <= t)
38     {
39         ans += sum[cur];
40         return ;
41     }
42     pushdown(cur,x,y);
43     if(s <= mid)
44         query(lc,x,mid,s,t,ans);
45     if(t >= mid+1)
46         query(rc,mid+1,y,s,t,ans);
47 }
48 void Add(int cur,int x,int y,int s,int t,int v)
49 {
50     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
51     if(x >= s && y <= t)
52     {
53         add[cur] += v;
54         sum[cur] += v * (y-x+1);
55         return ;
56     }
57     pushdown(cur,x,y);
58     if(s <= mid)
59         Add(lc,x,mid,s,t,v);
60     if(t >= mid+1)
61         Add(rc,mid+1,y,s,t,v);
62     update(cur);
63 }
64 int main()
65 {
66     int m,n,i,x,y,v;
67     long long ans;
68     char ch;
69     while(~scanf("%d%d",&n,&m))
70     {
71         for(D = 1; D < n; D <<= 1);
72         for(i = 0; i < n; i++)
73             scanf("%lld",&sum[D+i]);
74         //for(i = 1; i <= n; i++)
75             //cin>>a[i];
76         build(1,1,D);
77         while(m--)
78         {
79             getchar();
80             scanf("%c",&ch);
81             if(ch == 'Q')
82             {
83                 ans = 0;
84                 scanf("%d%d",&x,&y);
85                 query(1,1,D,x,y,ans);
86                 printf("%lld\n",ans);
87             }
88             else
89             {
90                 scanf("%d%d%d",&x,&y,&v);
91                 Add(1,1,D,x,y,v);
92             }
93         }
94     }
95     return 0;
96 }

今天又偷懒了,一到晚上就开始玩,想做题也没状态了,希望下次能改吧。

原文地址:https://www.cnblogs.com/lzxskjo/p/2588900.html