题目意思:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
线段树的应用,自己的第一个线段树代码,做题之前一直看高级数据结构之县单数并参考了大神代码,自己认为,线段树就是二叉树,只是结点的信息量比较大,主要的是怎么保存结点的信息,这个要根据题目意思进行修改,例如本题要求的数总人数,那么需要保存i-j的总人数,代码如下
AC代码:
/**
*线段树的简单应用,用scanf和printf输入输出
*cin和cout会超时
*/
#include
#include
#include
#include
using namespace std;
int a[50001];//存储结点的位置
struct node{
int left,right;//线段区间
int sum;//区间上的人数
}b[150005];
void Build(int left,int right,int i){//建树
int mid;
b[i].left=left;
b[i].right=right;
if(left==right){//先用数组存下该队的人
b[i].sum=a[left];
return ;
}
//cout<<"ok"<mid) return Query(left,right,2*i+1);//在右子树
else return Query(left,mid,2*i)+Query(mid+1,right,2*i+1);//否则在中间
}
int main()
{
int t,k=0,i,j,num,n;
char s[10];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
//cout<<"Case "<<++k<<":"<