博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu4027 Can you answer these queries? 线段树
阅读量:5812 次
发布时间:2019-06-18

本文共 2562 字,大约阅读时间需要 8 分钟。

A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapon to eliminate the battleships. Each of the battleships can be marked a value of endurance. For every attack of our secret weapon, it could decrease the endurance of a consecutive part of battleships by make their endurance to the square root of it original value of endurance. During the series of attack of our secret weapon, the commander wants to evaluate the effect of the weapon, so he asks you for help.

You are asked to answer the queries that the sum of the endurance of a consecutive part of the battleship line.
Notice that the square root operation should be rounded down to integer.

题意:有一列数,共两个操作,将区间每个数开成平方根(取四舍五入),和求区间和。

线段树,由于四舍五入开根,最后一定会开成1,所以记录区间和以及区间内是否全是1,若全是1则不需要再进行开根操作了。

1 #include
2 #include
3 #include
4 using namespace std; 5 typedef long long ll; 6 const int maxm=100005; 7 8 ll st[maxm<<2],a[maxm]; 9 bool ch[maxm<<2];10 int ql,qr;11 12 void build(int o,int l,int r){13 if(l==r){14 st[o]=a[l];15 if(st[o]==1)ch[o]=1;16 else ch[o]=0;17 return;18 }19 int m=l+((r-l)>>1);20 build(o<<1,l,m);21 build(o<<1|1,m+1,r);22 st[o]=st[o<<1]+st[o<<1|1];23 ch[o]=ch[o<<1]&ch[o<<1|1];24 }25 26 void update(int o,int l,int r){27 if(ch[o]==1)return;28 if(l==r){29 st[o]=sqrt(st[o]*1.0);30 if(st[o]==1)ch[o]=1;31 else ch[o]=0;32 return;33 }34 int m=l+((r-l)>>1);35 if(ql<=m)update(o<<1,l,m);36 if(qr>=m+1)update(o<<1|1,m+1,r);37 st[o]=st[o<<1]+st[o<<1|1];38 ch[o]=ch[o<<1]&ch[o<<1|1];39 }40 41 ll query(int o,int l,int r){42 if(ql<=l&&qr>=r)return st[o];43 int m=l+((r-l)>>1);44 ll ans=0;45 if(ql<=m)ans+=query(o<<1,l,m);46 if(qr>=m+1)ans+=query(o<<1|1,m+1,r);47 return ans;48 }49 50 int main(){51 int n;52 int cnt=0;53 while(scanf("%d",&n)!=EOF){54 int i;55 for(i=1;i<=n;++i)scanf("%I64d",&a[i]);56 build(1,1,n);57 int m;58 scanf("%d",&m);59 printf("Case #%d:\n",++cnt);60 for(i=1;i<=m;++i){61 int f;62 scanf("%d%d%d",&f,&ql,&qr);63 if(ql>qr){64 int t=ql;ql=qr;qr=t;65 }66 if(f==1)printf("%I64d\n",query(1,1,n));67 else update(1,1,n);68 }69 printf("\n");70 }71 return 0;72 }
View Code

 

转载于:https://www.cnblogs.com/cenariusxz/p/6597958.html

你可能感兴趣的文章
一周总结
查看>>
将txt文件转化为json进行操作
查看>>
线性表4 - 数据结构和算法09
查看>>
C语言数据类型char
查看>>
Online Patching--EBS R12.2最大的改进
查看>>
Binary Search Tree Iterator leetcode
查看>>
Oracle性能优化--DBMS_PROFILER
查看>>
uva-317-找规律
查看>>
Event事件的兼容性(转)
查看>>
我的2014-相对奢侈的生活
查看>>
zoj 2412 dfs 求连通分量的个数
查看>>
Java设计模式
查看>>
一文读懂 AOP | 你想要的最全面 AOP 方法探讨
查看>>
ndk制作so库,ndk-build不是内部或外部命令。。。的错误
查看>>
Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
查看>>
ORM数据库框架 SQLite 常用数据库框架比较 MD
查看>>
STL_算法_依据第n个元素排序(nth_element)
查看>>
BNU 34990 Justice String (hash+二分求LCP)
查看>>
华为OJ 名字美丽度
查看>>
Android 带清除功能的输入框控件EditTextWithDel
查看>>