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大。。。

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) 收藏 举报
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个 java 空指针异常的解决过程
· 揭开 SQL Server 和 PostgreSQL 填充因子的神秘面纱
· 没有调度器的协程不是好协程,零基础深入浅出 C++20 协程
· 别做抢活的导演:代码中的抽象层次原则
· 从 Redis 客户端超时到 .NET 线程池挑战
· 今年失业的程序员兄弟姐妹们,你们都去干什么了?
· TinyEditor v4.0 alpha 版本发布:表格更强大,表情更丰富,上传体验超乎想象!
· .NET周刊【7月第2期 2025-07-13】
· 圆方树学习笔记 —— 一种关于点双连通分量的思考方式
· MySQL 17 如何正确地显示随机消息?