HDU 4027--线段树

线段树,这里看起来有点像是成段更新,但是又不太像,不需要用到标记。。

题意:给你N个数,有M个操作,操作有两类,(1)"0 l r",表示将区间[l,r]里的每个数都开根号。(2)"1 l r",表示查询区间[l,r]里所有数的和。

这个题有两个注意的地方,一个是在更新sum的时候有个技巧,如果这个和等于区间的子树个数,即sum[rt]==r-l+1,这个时候就不用更新了。。因为sqrt(1)==1;否则会超时。

然后还有一个比较坑爹的地方,这里的a可能比b大。。。

复制代码
View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 #define maxn 100100
 6 #define lson l,m,rt<<1
 7 #define rson m+1,r,rt<<1|1
 8 __int64 sum[maxn<<2];
 9 void Pushup(int rt)
10 {
11     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
12 }
13 void build(int l,int r,int rt)
14 {
15     if(l==r)
16     {
17         scanf("%I64d",&sum[rt]);
18         return;
19     }
20     sum[rt]=0;
21     int m=(l+r)>>1;
22     build(lson);
23     build(rson);
24     Pushup(rt);
25 }
26 void update(int L,int R,int l,int r,int rt)
27 {
28     if(sum[rt]==r-l+1)
29         return;
30     if(l==r)
31     {
32         sum[rt]=sqrt((double)sum[rt]);
33         return;
34     }
35     int m=(l+r)>>1;
36     if(L<=m) update(L,R,lson);
37     if(R>m) update(L,R,rson);
38     Pushup(rt);
39 }
40 __int64 query(int L,int R,int l,int r,int rt)
41 {
42     if(L<=l&&r<=R)
43         return sum[rt];
44     __int64 ret=0;
45     int m=(l+r)>>1;
46     if(L<=m) ret+=query(L,R,lson);
47     if(R>m) ret+=query(L,R,rson);
48     return ret;
49 }
50 int main()
51 {
52     int n,m,a,b,c,cas=1;
53     while(~scanf("%d",&n))
54     {
55         printf("Case #%d:\n",cas++);
56         build(1,n,1);
57         scanf("%d",&m);
58         while(m--)
59         {
60             scanf("%d %d %d",&c,&a,&b);
61             if(a>b)
62             {
63                 a^=b;b^=a;a^=b;
64             }
65             if(c==0)
66                 update(a,b,1,n,1);
67             else
68                 printf("%I64d\n",query(a,b,1,n,1));
69         }
70         puts("");
71     }
72     return 0;
73 }
复制代码

 

posted on 2013-02-07 21:52  acoderworld  阅读(86)  评论(0)    收藏  举报

编辑推荐:
· 一个 java 空指针异常的解决过程
· 揭开 SQL Server 和 PostgreSQL 填充因子的神秘面纱
· 没有调度器的协程不是好协程,零基础深入浅出 C++20 协程
· 别做抢活的导演:代码中的抽象层次原则
· 从 Redis 客户端超时到 .NET 线程池挑战
阅读排行:
· 今年失业的程序员兄弟姐妹们,你们都去干什么了?
· TinyEditor v4.0 alpha 版本发布:表格更强大,表情更丰富,上传体验超乎想象!
· .NET周刊【7月第2期 2025-07-13】
· 圆方树学习笔记 —— 一种关于点双连通分量的思考方式
· MySQL 17 如何正确地显示随机消息?
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

导航

统计

点击右上角即可分享
微信分享提示