pku 3468 区间求和+统计,线段树

题意很明确,一个区间,给定2种操作
1、给[s,e]加上一个数
2、询问[s,e]的和
线段树写的有点搓,其实没必要搞那么复杂,还是采取标记下移就可以了。。郁闷
 1 import java.io.*;
 2 public class Main {
 3 
 4     /**
 5      * @param args
 6      */
 7     static class node
 8     {
 9         int s,e;
10         long add=0;
11         long sum=0;
12     }
13     static node st[]=new node[400000];
14     static void init(int s,int e,int pos)
15     {
16         st[pos].s=s;
17         st[pos].e=e;
18         if(e!=s+1)
19         {
20             init(s,(s+e)>>1,pos<<1);
21             init((s+e)>>1,e,(pos<<1)+1);
22         }
23     }
24     static void add(int s,int e,long add,int pos)
25     {
26         if(st[pos].s==s&&st[pos].e==e)
27         {
28             st[pos].add+=add;
29             st[pos].sum+=add*(e-s);
30         }
31         else
32         {
33             int mid=(st[pos].s+st[pos].e)>>1;
34             if(e<=mid)
35                 add(s,e,add,pos<<1);
36             else if(s>=mid)
37                 add(s,e,add,(pos<<1)+1);
38             else
39             {
40                 add(s,mid,add,pos<<1);
41                 add(mid,e,add,(pos<<1)+1);
42             }
43             st[pos].sum=st[pos<<1].sum+st[(pos<<1)+1].sum+st[pos].add*(st[pos].e-st[pos].s);
44         }
45     }
46     static long getsum(int s,int e,int pos)
47     {
48         if(st[pos].s==s&&st[pos].e==e)
49             return st[pos].sum;
50         else
51         {
52             int mid=(st[pos].s+st[pos].e)>>1;
53             if(e<=mid)
54                 return getsum(s,e,pos<<1)+st[pos].add*(e-s);
55             else if(s>=mid)
56                 return getsum(s,e,(pos<<1)+1)+st[pos].add*(e-s);
57             else
58                 return getsum(s,mid,pos<<1)+getsum(mid,e,(pos<<1)+1)+st[pos].add*(e-s);
59         }
60     }
61     public static void main(String[] args) throws Exception{
62         StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
63         for(int i=0;i<400000;i++)
64             st[i]=new node();
65         int n,q;
66         in.nextToken();
67         n=(int)in.nval;
68         in.nextToken();
69         q=(int)in.nval;
70         init(1,n+1,1);
71         for(int i=1;i<=n;i++)
72         {
73             in.nextToken();
74             add(i,i+1,(long)in.nval,1);
75         }
76         for(int i=1;i<=q;i++)
77         {
78             in.nextToken();
79             String jud=in.sval;
80             in.nextToken();
81             int a=(int)in.nval;
82             in.nextToken();
83             int b=(int)in.nval;
84             switch(jud.charAt(0))
85             {
86             case 'Q':
87                 System.out.println(getsum(Math.min(a, b),Math.max(a, b)+1,1));
88                 break;
89             case 'C':
90                 in.nextToken();
91                 add(Math.min(a, b),Math.max(a,b)+1,(long)in.nval,1);
92                 break;
93             }
94         }
95             
96     }
97 
98 }
99 


posted on 2010-10-28 01:34 yzhw 阅读(192) 评论(0)  编辑 收藏 引用 所属分类: data struct


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜