NYOJ116 士兵杀敌(二)线段树

解题思路:

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

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

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

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

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 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     else
24     {
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     else
36         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     else
54     {
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<q;i++)
74     {
75         scanf("%s",str);
76         if(str[0]==‘A‘)
77         {
78             scanf("%d%d",&a,&b);
79             in(0,a,b);
80         }
81         if(str[0]==‘Q‘)
82         {
83             ans=0;
84             scanf("%d%d",&a,&b);
85             qu(0,a,b);
86             printf("%d\n",ans+num[b]-num[a-1]);
87         }
88     }
89 }
时间: 2024-10-11 19:21:25

NYOJ116 士兵杀敌(二)线段树的相关文章

NYOJ 116 士兵杀敌 (线段树,区间和)

题目链接:NYOJ 116 士兵杀敌 士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描写叙述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军常常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧. 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候.须要考虑到新增的杀敌数. 输入 仅仅有一组測试数据 第一行是两个整数N,M,当中N表示士兵的个数(1<N<1000000).M表

NYOJ 116士兵杀敌(二) 树状数组

士兵杀敌(一) 数组是固定的,所以可以用一个sum数组来保存每个元素的和就行,但是不能每次都加,因为那样会超时,查询次数太多.但是这个士兵杀敌(二)就不能用那个方法来解了,因为这个是动态的,中间元素的值可能会变化,所以引出一个新的东西来.刚开始想了一下,实在是没有想到方法,就去讨论区看了看,一看好像都说用树状数组,就去找树状数组的用法. 先上图,看着图解释容易理解点. 数组A是原数组中的元素,数组C是树状数组中的元素,图中C数组的元素组成为A中的某些元素之和,这些元素的个数取决于它的下标能被多少

NYOJ 116 士兵杀敌二

士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧. 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数. 输入 只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数.(1<M<1000

nyoj116 士兵杀敌(二)(线段树的区间查询和单点更新)

题目116 题目信息 运行结果 本题排行 讨论区 士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧. 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数. 输入 只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000)

nyoj116士兵杀敌(二)线段树单点更新

士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧. 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数. 输入 只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数.(1<M<1000

NYOJ116 士兵杀敌(二)【树状数组】

士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧. 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数. 输入 只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数.(1<M<1000

【树状数组(二叉索引树)】轻院热身—candy、NYOJ-116士兵杀敌(二)

[概念] 转载连接:树状数组 讲的挺好. 这两题非常的相似,查询区间的累加和.更新结点.Add(x,d) 与 Query(L,R) 的操作 [题目链接:candy] 唉,也是现在才发现这题用了这个知识,当初A的第一个数据结构的题就是关于树状数组的,忘了忘了.. Problem C: candy Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 252  Solved: 63 SubmitStatusWeb Board Description Kimi

NYOJ 116 士兵杀敌(二)

士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧. 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数. 输入 只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数.(1<M<1000

士兵杀敌1(树状数组)

首先,要先讲讲树状数组: 树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值. 假设数组a[1..n],那么查询a[1]+...+a[n]的时间是log级别的,而且是一个在线的数据结构,支持随时修改某个元素的值,复杂度也为log级别. 来观察上面的图: 令