您的位置:首页 > 其它

hdu 1166 敌兵布阵

2012-05-27 14:32 211 查看
线段树的模版 没什么思想
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <ctime>
#define LL long long
#define Vi vector<int>
#define Si set<int>
#define readf freopen("input.txt","r",stdin)
#define writef freopen("output.txt","w",stdout)
#define FU(i,a) for(int i(1); i <= (a); i++)
#define FD(i,a) for(int i(a); i >= (1); i--)
#define FOR(i,a,b) for(int i(a);i <= (b); i++)
#define FORD(i,a,b) for(int i(a);i >= (b); i--)
#define SET(a,b) memset(a,b,sizeof(a))
#define SD(a) scanf("%d",&(a))
#define LN printf("\n")
#define PS printf(" ")
#define pb push_back
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
const int maxn = 222222;
int value[maxn>>2],N;

struct node{
int a,b,sum;
}tree[maxn];// a为线段的左端点,b为右端点,sum即为这个怎么说....和!

void buildTree(int a,int b,int k){

tree[k].a=a;
tree[k].b=b;

if(a==b){
tree[k].sum=value[a];
return ;     //别忘记return ,太纠结了
}

int mid=(a+b)>>1;   //装B利器  位运算! 其实就是除以2

buildTree(a,mid,k<<1);   //装B利器  位运算! 其实就是乘以2
buildTree(mid+1,b,k<<1|1) ; //装B利器  位运算! 其实就是乘以2+1;

tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;   //先建树后统计,所以写在后面
}// k为根结点,a为左端点,b为右端点

void update(int a,int val,int k){

if(tree[k].a==tree[k].b){
tree[k].sum+=val;
return ;
}//只有到了跟结点才会更新此点的值
if(a <= tree[k<<1].b )
update(a,val,k<<1);
else
update(a,val,k<<1|1);

tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;//不要忘记将所有父节点什么的更新
}//应该每次都从根节点开始找吧..~~

int query(int x,int y,int k){

if(x <= tree[k].a && tree[k].b <=y)
return tree[k].sum;   //如果区间将此段包含在内,直接返回

else{

int t=0;
if( x <= tree[k<<1].b )    //如果 x 在 k区间段内,y在大于k的区间段内
t+=query(x,y,k<<1);

if( y >= tree[k<<1|1].a)   //同理
t+=query(x,y,k<<1|1);

return t;
}
}
int main() {

int T;
SD(T);
FOR(cas,1,T){
memset(tree,0,sizeof(tree));
scanf("%d",&N);
FOR(i,1,N)
SD(value[i]);
buildTree(1,N,1);

printf("Case %d:\n",cas);
char op[9];
int i,j;
while(~scanf("%s",op) && op[0]!='E'){
SD(i);SD(j);
if(op[0]=='A')
update(i,j,1);
else if(op[0]=='S')
update(i,-j,1);
else
printf("%d\n",query(i,j,1));
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: