NYOJ108士兵杀敌(一)
来源:互联网 发布:海知智能上市了吗 编辑:程序博客网 时间:2024/06/05 19:39
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=108
一开始竟然用的vector保存的第i项到第j项的和,果断爆掉了内存呢,我真的是醉了。。
用一个数组保存前K项的和,例如 b[k] = a[1] + ... + a[k] 的和,然后就不说了,都是泪。。(用时244MS)
代码:
#include <cstdio>#include <cstring>using namespace std;const int maxn = 1e6;int b[maxn + 5];int a[maxn + 5];int main(){ int n,m; scanf("%d%d",&n,&m); //printf("%d %d\n",n,m); for(int i = 1;i <= n;++i){ scanf("%d",&a[i]); } for(int i = 1;i <= n;++i) { b[i] = b[i - 1] + a[i]; } while(m--) { int c,d; scanf("%d%d",&c,&d); if(c > d) { int t = c; c = d; d = t; } printf("%d\n",b[d] - b[c] + a[c]); } return 0;}
还有一种用树状数组的方法,用时316MS
代码:
#include <cstdio>const int maxn = 1e6;int a[maxn + 5];int c[maxn + 5];int n,m;void add(int k,int num){ while(k <= n) { c[k] += num; k += k & -k; }}int query(int k){ int sum = 0; while(k) { sum += c[k]; k -= k & -k; } return sum;}int main(){ scanf("%d%d",&n,&m); for(int i = 1;i <= n;++i){ scanf("%d",&a[i]); add(i,a[i]); } while(m--) { int x,y; scanf("%d%d",&x,&y); if(x > y) { int t = x; x = y; y = t; } printf("%d\n",query(y) - query(x - 1)); } return 0;}
0 0
- NYOJ108 士兵杀敌(一)
- nyoj108士兵杀敌(一)
- NYOJ108士兵杀敌(一)
- 士兵杀敌(一)||NYOJ108
- nyoj108士兵杀敌(一)
- NYOJ108 士兵杀敌(一)【树状数组】
- nyoj108——士兵杀敌(一)
- 【nyoj108】士兵杀敌一(线段树)
- NYOJ108 士兵杀敌(一)(树状数组)
- nyoj108 士兵杀敌(一) (线段树)
- nyoj108~士兵杀敌(一)(树状数组+线段树)
- nyoj108士兵杀敌
- nyoj108 士兵杀敌
- 士兵杀敌(一)
- 士兵杀敌(一)
- 士兵杀敌(一)
- 士兵杀敌(一)
- 士兵杀敌(一)
- Hadoop 源码编译-protoc安装
- mac下IDEA配置Spring框架+mybatis+maven配置管理的web项目过程详解
- 中国制造迈向中国创造
- 移动端H5之动态设置html的font-size的横屏BUG修复以及横屏提示 by FungLeo
- 中兴ME3620模块,作为无线上网卡用
- NYOJ108士兵杀敌(一)
- 五家公司市值超2.2万亿美元!亚马逊谷歌Facebook被评“买入”,微软苹果呢?
- ABC
- 走进Scala——伴生对象(Companion Object)
- 守护进程知识及示例
- to many values to unpack
- LeetCode 113 Path Sum II
- LintCode:报数
- [Ahoi2013]作业 解题报告