博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NYOJ116 士兵杀敌(二)线段树
阅读量:5378 次
发布时间:2019-06-15

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

解题思路:

先用数组累计从1~n的杀敌数,所以从i~j的杀敌数就是sum[j]-sum[i-1];

进行加的时候再用线段树进行单点更新m次时间复杂度就是O(mlogn)

查找时先从累加数组中计算出最开始的杀敌数再去线段树中计算后来的杀敌数

m次时间复杂度就是O(mlogn)

1 #include 
2 #include
3 #include
4 struct node 5 { 6 int l,r; 7 int sum; 8 int mid() 9 {10 return (l+r)/2;11 }12 };13 int num[1000005];14 node t[4000005];15 int n,q;16 int ans=0;17 void init(int root,int l,int r)18 {19 t[root].l=l;20 t[root].r=r;21 t[root].sum=0;22 if(l==r) return;23 else24 {25 init(2*root+1,l,t[root].mid());26 init(2*root+2,t[root].mid()+1,r);27 }28 }29 void in(int root,int i,int num)30 {31 t[root].sum+=num;32 if(i==t[root].l&&i==t[root].r) return;33 else if(i<=t[root].mid())34 in(2*root+1,i,num);35 else36 in(2*root+2,i,num);37 }38 void qu(int root,int l,int r)39 {40 if(t[root].l==l&&t[root].r==r)41 {42 ans+=t[root].sum;43 return;44 }45 if(r<=t[root].mid())46 {47 qu(2*root+1,l,r);48 }49 else if(l>t[root].mid())50 {51 qu(2*root+2,l,r);52 }53 else54 {55 qu(2*root+1,l,t[root].mid());56 qu(2*root+2,t[root].mid()+1,r);57 }58 }59 60 int main()61 {62 scanf("%d",&n);63 scanf("%d",&q);64 init(0,1,n);65 memset(num,0,sizeof(num));66 for(int i=1;i<=n;i++)67 {68 scanf("%d",&num[i]);69 num[i]=num[i]+num[i-1];70 }71 char str[15];72 int a,b;73 for(int i=0;i

 

转载于:https://www.cnblogs.com/kearon/p/6747047.html

你可能感兴趣的文章
百度地图2.0API和3.0API。你想要的百度地图的这都有
查看>>
专业词汇
查看>>
星期五的收获
查看>>
proxmox 去除订阅提示
查看>>
使用Html.EditorFor()为文本框加上maxlength,placeholder等属性
查看>>
[转]后缀数组求最长重复子串
查看>>
设计模式——外观模式详解
查看>>
mysql (一)
查看>>
photoshop图层样式初识1
查看>>
【.NET】使用HtmlAgilityPack抓取网页数据
查看>>
typedef的使用
查看>>
基于位置的本地商铺个性化推荐
查看>>
职场上一个人情商高的十种表现
查看>>
【底层原理】深入理解Cache (下)
查看>>
Elasticsearch安装中文分词插件IK
查看>>
进阶4:常见函数-单行函数
查看>>
简述企业信息化与企业架构关系
查看>>
npoi List 泛型导出
查看>>
流程图怎么画?分享绘制流程图简单方法
查看>>
squid的处理request和reply的流程
查看>>