南阳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 1000001int 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;}

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

,你可以很有个性,但某些时候请收敛。

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

相关文章:

  • 【算法】直接插入排序C语言实现
  • 嵌入式 FAAC1.28 在海思HI3518C/HI3518A平台linux中的编译优化
  • Android 动画animation 深入分析
  • 你感兴趣的文章:

    标签云:

    亚洲高清电影在线, 免费高清电影, 八戒影院夜间, 八戒电影最新大片, 出轨在线电影, 午夜电影院, 在线影院a1166, 在线电影院, 在线观看美剧下载, 日本爱情电影, 日韩高清电影在线, 电影天堂网, 直播盒子app, 聚合直播, 高清美剧, 高清美剧在线观看 EhViewer-E站, E站, E站绿色版, qqmulu.com, qq目录网, qq网站目录,