HDU1166 敌兵布阵 线段树详解
题解:
更新是线段树的单点更新,简单一点。
有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 敌兵布阵 线段树详解的更多相关文章
- hdu 1166 敌兵布阵(线段树详解)
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- HDU-1166敌兵布阵(线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- hdu1166 敌兵布阵(线段树 求区间和 更新点)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu1166 敌兵布阵 线段树(区间更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU1166 敌兵布阵(线段树)
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- 【生活没有希望】hdu1166敌兵布阵 线段树
线段树水题刷刷,生活没有希望 最近看到代码跟树状数组差不多短的非递归线段树,常数也很小——zkw线段树 于是拿道水题练练手 短到让人身无可恋 ;pos;pos/=) a[pos]+=x;} ,ans= ...
- HDU1166 敌兵布阵 —— 线段树单点修改
题目链接:https://vjudge.net/problem/HDU-1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布 ...
- HDU1166 敌兵布阵 [线段树模板]
题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
随机推荐
- [SCOI2008]奖励关_状压动归_数学期望
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 20; dou ...
- 内核如何检测SOFT LOCKUP与HARD LOCKUP?
内核如何检测SOFT LOCKUP与HARD LOCKUP? From article 所谓lockup,是指某段内核代码占着CPU不放.Lockup严重的情况下会导致整个系统失去响应.Lockup有 ...
- iframe嵌入的子页面如何刷新父窗口
iframe中刷新父页面方法及一些按钮刷新代码集合[原创+转]2009-07-23 11:12a页面里iframe了个b页面,我想实现在b页面里一个按钮,一按就刷新a页面,也就是父页面,不是只刷新if ...
- CSS - display:inline-block 相邻元素间有4px的空白间距
取消“display:inline-block 相邻元素间有4px的空白间距” Demo:http://jsfiddle.net/JSDavi/p6gcx6nx/ 例子: <div sytle= ...
- MYSQL数据库常用的LINUX命令
此为我工作中常用MYSQL数据库命令 LINUX系统中启动 / 重启MYSQL服务:service mysql start / service mysql restart(重启服务) LINUX系 ...
- gpio_request 原形代码
http://blog.csdn.net/maopig/article/details/7428561 其原型为 int gpio_request(unsigned gpio, const char ...
- SpringBoot 对静态资源的映射规则
一.所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源 webjars:以jar包的方式引入静态资源,如下:引入 jquery ...
- HelloWorld编译正常运行报noclassdeffounderror
修改环境变量classpath: 原理: classpath是搜索java类库的路径:当你输入命令“java HelloWorld“时,会根据classpath寻找HelloWorld.class:一 ...
- HDU 5167
范围 内的斐波那契的数不多,求出范围内的数,再暴力枚举即可. #include <iostream> #include <cstdio> #include <algori ...
- [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 ...