士兵杀敌(一)nyoj
来源:互联网 发布:站内优化 编辑:程序博客网 时间:2024/06/14 22:02
这是一道很基础的线段树,用查询即可。
#include <iostream>
#include<algorithm>
#include <cstdio>
#include <cstring>
#define MAX 1000010
using namespace std;
int array[MAX];
int segTree[MAX * 4 + 10]; //线段树数组大小约为原数组大小的4倍
void build(int node, int begin, int end) {
if(begin == end) {
segTree[node] = array[begin]; //叶节点
}
else {
build(node * 2, begin, (begin + end) / 2);
build(node * 2 + 1, (begin + end) / 2 + 1, end);
segTree[node] = segTree[node * 2] + segTree[node * 2 + 1]; //对两个孩子求和
}
}
int query(int node, int begin, int end, int left, int right) {
if(begin == left && end == right) {
return segTree[node];
}
else { //将区间一分为二,讨论三种情况
int mid = (begin + end) / 2;
if(right <= mid) return query(node * 2, begin, mid, left, right);
else if(left > mid) return query(node * 2 + 1, mid + 1, end, left, right);
else return query(node * 2, begin, mid, left, mid) + query(node * 2 + 1, mid + 1, end, mid + 1, right); //查询区间和原始区间都要对半分。
}
}
int main() {
int N, M;
scanf("%d %d", &N, &M);
int i;
for(i = 1; i <= N; i++) {
scanf("%d", &array[i]);
}
build(1, 1, N);
int left, right;
while(M--) {
scanf("%d %d", &left, &right);
printf("%d\n", query(1, 1, N, left, right));
}
return 0;
}
#include <iostream>
#include<algorithm>
#include <cstdio>
#include <cstring>
#define MAX 1000010
using namespace std;
int array[MAX];
int segTree[MAX * 4 + 10]; //线段树数组大小约为原数组大小的4倍
void build(int node, int begin, int end) {
if(begin == end) {
segTree[node] = array[begin]; //叶节点
}
else {
build(node * 2, begin, (begin + end) / 2);
build(node * 2 + 1, (begin + end) / 2 + 1, end);
segTree[node] = segTree[node * 2] + segTree[node * 2 + 1]; //对两个孩子求和
}
}
int query(int node, int begin, int end, int left, int right) {
if(begin == left && end == right) {
return segTree[node];
}
else { //将区间一分为二,讨论三种情况
int mid = (begin + end) / 2;
if(right <= mid) return query(node * 2, begin, mid, left, right);
else if(left > mid) return query(node * 2 + 1, mid + 1, end, left, right);
else return query(node * 2, begin, mid, left, mid) + query(node * 2 + 1, mid + 1, end, mid + 1, right); //查询区间和原始区间都要对半分。
}
}
int main() {
int N, M;
scanf("%d %d", &N, &M);
int i;
for(i = 1; i <= N; i++) {
scanf("%d", &array[i]);
}
build(1, 1, N);
int left, right;
while(M--) {
scanf("%d %d", &left, &right);
printf("%d\n", query(1, 1, N, left, right));
}
return 0;
}
0 0
- NYOJ - 士兵杀敌(一)
- NYOJ 士兵杀敌(一)
- NYOJ-士兵杀敌(一)
- nyoj 士兵杀敌(一)
- 士兵杀敌(一)nyoj
- NYOJ-【士兵杀敌(一)】
- NYOJ---108--士兵杀敌(一)
- nyoj 108 士兵杀敌(一)
- nyoj-108-士兵杀敌(一)
- NYOJ 108 士兵杀敌(一)
- NYOJ 108 士兵杀敌(一)
- NYOJ-108士兵杀敌(一)
- nyoj 108 士兵杀敌(一)
- NYOJ 108 士兵杀敌(一)
- NYOJ 题目108士兵杀敌(一)
- NYOJ 108 士兵杀敌(一)
- NYOJ-108-士兵杀敌(一)
- nyoj 108士兵杀敌(一)
- 160. Intersection of Two Linked Lists
- angel arena reborn 装备合成说明
- JNIEnv 速查
- mysql数据备份
- 【Arduino官方教程第一辑】示例程序 6-2 用压电元件检测振动
- 士兵杀敌(一)nyoj
- Android源码分析之Builder模式
- 排序算法之——冒泡排序(一)
- 敏捷开发,英文是Agile,我所理解的敏捷
- Linux shell提交github安装以及使用
- nagios插件之监控tcp的established数量
- 【每天学一点】JAVASE02
- Educational Codeforces Round 13——D. Iterated Linear Function(矩阵快速幂或普通快速幂水题)
- Zynq入门基础实验一之Helloworld