题解:

更新是线段树的单点更新,简单一点。

有50000个阵营,40000查询,用普通数组肯定超时。区间求和和区间查询问题用线段树最好不过了。

先说说什么是线段树。

区间[1,10]用树的方法存起来,怎么存呢,来看下图:

线段树结构主要用于区间查询和更新。时间复杂度为lgN。虽然空间大了但时间快了。对于数据到达 亿 级别的,效果尤为显著。

知道了线段树的结构,那么怎么用代码实现建树,查询以及更新呢..看代码。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring> //杭电上 如果用c++编译器则改成incluce<string> ,c++编译器不支持cstring不知道为啥。 using namespace std; //这道题建议用G++编译器提交 const int MAX=50001; typedef struct node //定义树节点
{
node(){l=0,r=0,data=0;} //构造函数
int l,r; //区间[l,r]
int data; //数据,这里指区间[l,r]的和
}TreeNode; TreeNode treeNode[MAX<<4];
int a[MAX]; void update(int p) //向上更新
{
treeNode[p].data=treeNode[p*2].data+treeNode[p*2+1].data;
} void buildTree(int p,int l,int r) //建树,p是节点编号,从1开始,l,r是区间
{
treeNode[p].l=l;
treeNode[p].r=r; if(l==r) //如果是叶子节点,则赋值 返回
{
treeNode[p].data=a[l];
return;
}
int mid=(l+r)>>1; //
buildTree(p<<1,l,mid); //递归地创建左子树和右子树 p<<1 <==> p*2
buildTree(p<<1|1,mid+1,r); // p<<1|1 <==> p*2+1
update(p); //回溯的时候更新data值
return;
} void add(int p,int k,int x) //添加方法,p节点编号(索引),k为要修改的区间[k,k],x为要修改的值
{
if(treeNode[p].l==k&&treeNode[p].r==k) //如果找到区间[k,k]
{
treeNode[p].data+=x;
return;
}
int mid=(treeNode[p].l+treeNode[p].r)/2;
if(k<=mid) add(p<<1,k,x); //如果要修改的点在当前区间的左边,查找左子树
else add(p<<1|1,k,x); //如果要修改的点在当前区间的右边,在右子树里查找
update(p); //回溯的时候更新data信息
return;
} int query(int p,int l,int r) //p为节点编号,查询区间[l,r];
{
if(treeNode[p].l>=l&&treeNode[p].r<=r) //如果当前节点的区间在[l,r]内
{
return treeNode[p].data;
}
if(treeNode[p].l>r||treeNode[p].r<l) //如果当前区间和要查找的区间没有交集
{
return 0;
}
int sum=0;
sum+=query(p<<1,l,r); //查询左子树
sum+=query(p<<1|1,l,r); //查询右子树
return sum;
} int main()
{
int n,tt; //区间[1,n],有tt组测试数据
//cin>>tt; //测试数据 输入就有 40000+,用cin就超时,scanf秒过,或者能用scanf的就用scanf
scanf("%d",&tt);
for(int t=1;t<=tt;t++)
{
//cin>>n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
//cin>>a[i];
scanf("%d",&a[i]);
}
buildTree(1,1,n); //建树,节点编号从1开始,区间[1,n] string op; //操作 printf("Case %d:\n",t); while(cin>>op) //string 类型只能用cin输入
{
if(op=="Query")
{
int a,b;
//cin>>a>>b;
scanf("%d%d",&a,&b);
//cout<<query(1,a,b)<<endl;
printf("%d\n",query(1,a,b));
continue;
}
if(op=="Add")
{
int a,b;
//cin>>a>>b;
scanf("%d%d",&a,&b);
add(1,a,b);
continue;
}
if(op=="Sub")
{
int a,b;
//cin>>a>>b;
scanf("%d%d",&a,&b);
add(1,a,-b);
continue;
}
if(op=="End")
{
break;
}
} }
return 0;
}

  

HDU1166 敌兵布阵 线段树详解的更多相关文章

  1. hdu 1166 敌兵布阵(线段树详解)

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  2. HDU-1166敌兵布阵(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...

  3. hdu1166 敌兵布阵(线段树 求区间和 更新点)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. hdu1166 敌兵布阵 线段树(区间更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. HDU1166 敌兵布阵(线段树)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  6. 【生活没有希望】hdu1166敌兵布阵 线段树

    线段树水题刷刷,生活没有希望 最近看到代码跟树状数组差不多短的非递归线段树,常数也很小——zkw线段树 于是拿道水题练练手 短到让人身无可恋 ;pos;pos/=) a[pos]+=x;} ,ans= ...

  7. HDU1166 敌兵布阵 —— 线段树单点修改

    题目链接:https://vjudge.net/problem/HDU-1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布 ...

  8. HDU1166 敌兵布阵 [线段树模板]

    题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...

  9. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

随机推荐

  1. [SCOI2008]奖励关_状压动归_数学期望

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 20; dou ...

  2. 内核如何检测SOFT LOCKUP与HARD LOCKUP?

    内核如何检测SOFT LOCKUP与HARD LOCKUP? From article 所谓lockup,是指某段内核代码占着CPU不放.Lockup严重的情况下会导致整个系统失去响应.Lockup有 ...

  3. iframe嵌入的子页面如何刷新父窗口

    iframe中刷新父页面方法及一些按钮刷新代码集合[原创+转]2009-07-23 11:12a页面里iframe了个b页面,我想实现在b页面里一个按钮,一按就刷新a页面,也就是父页面,不是只刷新if ...

  4. CSS - display:inline-block 相邻元素间有4px的空白间距

    取消“display:inline-block 相邻元素间有4px的空白间距” Demo:http://jsfiddle.net/JSDavi/p6gcx6nx/ 例子: <div sytle= ...

  5. MYSQL数据库常用的LINUX命令

    此为我工作中常用MYSQL数据库命令 LINUX系统中启动 / 重启MYSQL服务:service mysql start  /  service mysql restart(重启服务) LINUX系 ...

  6. gpio_request 原形代码

    http://blog.csdn.net/maopig/article/details/7428561 其原型为 int gpio_request(unsigned gpio, const char ...

  7. SpringBoot 对静态资源的映射规则

    一.所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源 webjars:以jar包的方式引入静态资源,如下:引入 jquery ...

  8. HelloWorld编译正常运行报noclassdeffounderror

    修改环境变量classpath: 原理: classpath是搜索java类库的路径:当你输入命令“java HelloWorld“时,会根据classpath寻找HelloWorld.class:一 ...

  9. HDU 5167

    范围 内的斐波那契的数不多,求出范围内的数,再暴力枚举即可. #include <iostream> #include <cstdio> #include <algori ...

  10. [Node.js] Proxy Requests for Local and Remote Service Parity

    High availability apps require that no distinction be made between local and remote services. Attach ...