我是靠谱客的博主 快乐早晨,最近开发中收集的这篇文章主要介绍HDOJ 1166,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include<stdio.h>
#include<string.h>
#define MAX 50000
#define L(x) (x << 1)
#define R(x) (x << 1|1)
typedef struct
{
int left;
int right;
int sum;
}Node;
Node node[4*MAX];
int cnt;
void build(int l,int r,int k)
{
node[k].left = l;
node[k].right = r;
node[k].sum = 0;
if(l == r)
return ;
int mid = (l + r) >> 1;
build(l,mid,L(k));
build(mid+1,r,R(k));
}
void insert(int pos,int num,int k)
{
if(pos >= node[k].left && pos <= node[k].right)
node[k].sum += num;
if(node[k].left == node[k].right)
return ;
if(pos <= node[L(k)].right)
insert(pos,num,L(k));
else
insert(pos,num,R(k));
}
void get_result(int l,int r,int k)
{
if(l == node[k].left && r == node[k].right)
{
cnt += node[k].sum;
return ;
}
if(node[k].left == node[k].right)
return ;
if(r < node[R(k)].left)
get_result(l,r,L(k));
else if(l > node[L(k)].right)
get_result(l,r,R(k));
else
{
get_result(l,node[L(k)].right,L(k));
get_result(node[R(k)].left,r,R(k));
}
}
int main()
{
int T,n,i,j,k;
char str[10];
scanf("%d",&T);
k = 0;
while(T--)
{
k ++;
memset(str,0,sizeof(str));
scanf("%d",&n);
build(1,n,1);
for(i = 1;i <= n;i ++)
{
scanf("%d",&j);
insert(i,j,1);
}
scanf("%s",str);
int flag = 0;
while(strcmp(str,"End"))
{
if(!strcmp(str,"Query") && !flag)
{
printf("Case %d:n",k);
flag = 1;
}
if(!strcmp(str,"Query"))
{
cnt = 0;
scanf("%d%d",&i,&j);
get_result(i,j,1);
printf("%dn",cnt);
}
if(!strcmp(str,"Add"))
{
scanf("%d%d",&i,&j);
insert(i,j,1);
}
if(!strcmp(str,"Sub"))
{
scanf("%d%d",&i,&j);
insert(i,-j,1);
}
memset(str,0,sizeof(str));
scanf("%s",str);
}
}
return 0;
}


转载于:https://www.cnblogs.com/wangzhili/p/3950351.html

最后

以上就是快乐早晨为你收集整理的HDOJ 1166的全部内容,希望文章能够帮你解决HDOJ 1166所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部