南阳oj 士兵杀敌(二) 题目116 NYOJ 数据结构



/*士兵杀敌(二)

时间限制:1000 ms  |  内存限制:65535 KB

难度:5

描述

南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。

小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。

南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。

输入

只有一组测试数据

第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数。(1<M<100000)

随后的一行是N个整数,ai表示第i号士兵杀敌数目。(0<=ai<=100)

随后的M行每行是一条指令,这条指令包含了一个字符串和两个整数,首先是一个字符串,如果是字符串QUERY则表示南将军进行了查询操作,后面的两个整数m,n,表示查询的起始与终止士兵编号;如果是字符串ADD则后面跟的两个整数I,A(1<=I<=N,1<=A<=100),表示第I个士兵新增杀敌数为A.

输出

对于每次查询,输出一个整数R表示第m号士兵到第n号士兵的总杀敌数,每组输出占一行

样例输入

5 6 1 2 3 4 5 QUERY 1 3 ADD 1 2 QUERY 1 3 ADD 2 3 QUERY 1 2 QUERY 1 5

样例输出

6 8 8 20

代码:*/

//普通超时代码

#include<stdio.h>

#include<stdlib.h>

#define N 1000001

int s[N],m,n,k,l;

void ji()

{

for(int i=k;i<=n;i++)

s[i]+=l;

}

void chu()

{printf("%d\n",s[l]-s[k-1]);}

int main()

{

scanf("%d %d",&n,&m);

s[0]=0;

for(int i=1;i<=n;i++)

{

scanf("%d",&s[i]);

s[i]+=s[i-1];

}

char h[100];

for(int j=0;j<m;j++)

{

scanf("%s %d %d",h,&k,&l);

if(h[0]==‘Q‘) printf("%d\n",s[l]-s[k-1]);

if(h[0]==‘A‘) ji();

}

return 0;

}

//利用树状数组解决动态改变数组的问题,因为前边一个士兵改变杀敌数,后边都要跟着改变

#include<stdio.h>

int a[1000010],N;

int lowbit(int pat)

{

return pat&(-pat);//返回值是2的k次方幂,k是pat转换为2进制  从右往左数0的个数

}

void pus(int pat,int numb)

{

while(pat<=N)

{

a[pat]+=numb;

pat+=lowbit(pat);

}

}

int getsum(int pat)

{

int sum=0;

while(pat>=1)

{

sum+=a[pat];

pat-=lowbit(pat);

}

return sum;

}

int main()

{

int M,i,from,to,num;

char str[10];

scanf("%d%d",&N,&M);

for(i=1;i<=N;++i)

{

scanf("%d",&num);

pus(i,num);

}

while(M--)

{

scanf("%s%d%d",str,&from,&to);

if(str[0]==‘Q‘)

printf("%d\n",getsum(to)-getsum(from-1));

else

{

pus(from,to);

}

}

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 01:13:48

南阳oj 士兵杀敌(二) 题目116 NYOJ 数据结构的相关文章

NYOJ 116 士兵杀敌二

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

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

南阳 oj 表达式求值 题目35 数据结构 NYOj

 建议不会的看别人的代码自己在之上模拟一遍,只要耐心模拟就会做出来 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 using namespace std; char s[N];//存储字符串 char str1[N];//存储'o'-到'9'的字符 char str2[N];//存储运算符 int top1,top2;//利用数组模拟栈 int compare(char

南阳 oj 表达式求值 题目35 数据结构 NYO题目链接

?? 建议不会的看别人的代码自己在之上模拟一遍,仅仅要耐心模拟就会做出来 题目链接:http://acm.nyist.net/JudgeOnline/problem.php? pid=35 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 using namespace std; char s[N];//存储字符串 char str1[N];//存储'o'-到'9'的字符 cha

南阳oj 语言入门 素数 题目169 素数距离 题目24

 素数  题目169 #include<stdio.h> #include<math.h> int main(){ int prime(int a); int i,j,n,rd,ld,p; scanf("%d",&n); while(n--){ int num,lnum,rnum; scanf("%d",&num); if(num==1){ printf("2\n"); continue; } p=pr

南阳oj 前缀式计算 题目218

 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stack> #define N 1000 using namespace std; char s[N],b[3]; stack<double>num; stack<char>st; int main() { while(gets(s)) { int k=strlen(s); double a1,a2

士兵杀敌(二)(南阳116)

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

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

题目链接:NYOJ 116 士兵杀敌(二) 这一个是线段树的入门级水题,本题要求我们给出某个区间的区间和.这个问题和线段树的单点更新还是基本一致的.只要把单点更新中的值覆盖变为值得叠加,这一题便可以轻松解决了.如果不知道线段树的单点更新,请移步:传送门 [代码如下] #include <stdio.h> #include <string.h> #define MAXN 1<<21 //lg100000 约等于 21 typedef struct{ int left,ri