标签:dp
思路:标准的线段树
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#define N 10005<<1
#define INF 10000000
#define LL long long
#define eps 10E-9
#define mem(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define w(a) while(a)
#define s(a) scanf("%d",&a)
#define ss(a,b) scanf("%d%d",&a,&b)
#define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define PI acos(-1.0)
using namespace std;
int n;
int arr[50010];
struct node {
int left, right, sum;
}s[150008];
void tree_build(int left, int right, int i){
int mid;
s[i].left = left;
s[i].right = right;
if(left == right){
s[i].sum = arr[right]; return ;
}
mid = (left + right)/2;
tree_build(left, mid, 2*i);
tree_build(mid+1, right, 2*i+1);
s[i].sum = s[2*i].sum + s[2*i+1].sum;
}
void tree_a(int id, int num, int i){
if(s[i].left == s[i].right){
s[i].sum += num; return ;
}
else{
s[i].sum += num;
if(id <= s[2*i].right) tree_a(id, num, 2*i);
else tree_a(id, num, 2*i+1);
}
}
int tree_q(int left, int right, int i){
int mid;
if(s[i].left == left && s[i].right == right) return s[i].sum;
mid = (s[i].left + s[i].right)/2;
if(right <= mid) return tree_q(left, right, 2*i);
else if(left > mid) return tree_q(left, right, 2*i+1);
else return tree_q(left, mid, 2*i) + tree_q(mid+1, right, 2*i+1);
}
int main(){
int t;
string str;
s(t);
int time = 1;
w(t--){
s(n);
printf("Case %d:\n",time++);
for(int i=1; i<=n; i++){
s(arr[i]);
}
tree_build(1, n ,1);
int a, b;
w(1){
cin>>str;
if(str =="End") break;
ss(a,b);
if(str == "Query") cout<<tree_q(a, b, 1)<<endl;
if(str == "Add") tree_a(a, b, 1);
if(str == "Sub") tree_a(a, -b, 1);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:dp
原文地址:http://blog.csdn.net/bigsungod/article/details/46997919