HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板
自己写的第一棵线段树&第一棵树状数组 莫名的兴奋
线段树:
#include <cstdio>
using namespace std;
int cases,n,tree[200500],ql,qr;
char s[50];
void build(int l,int r,int num){
if(l==r){scanf("%d",&tree[num]);return;}
int mid=(l+r)/2;
build(l,mid,num*2);
build(mid+1,r,num*2+1);
tree[num]=tree[2*num]+tree[2*num+1];
}
int qu(int l,int r,int num){
if(ql<=l&&qr>=r)return tree[num];
int mid=(l+r)/2,sum=0;
if(mid>=ql)sum+=qu(l,mid,num*2);
if(mid<qr)sum+=qu(mid+1,r,num*2+1);
return sum;
}
void add(int l,int r,int num){
if(l==r){tree[num]+=qr;return;}
int mid=(l+r)/2;
if(mid>=ql)add(l,mid,num*2);
if(mid<ql)add(mid+1,r,num*2+1);
tree[num]=tree[2*num]+tree[2*num+1];
}
int main()
{
scanf("%d",&cases);
for(int ii=1;ii<=cases;ii++){
printf("Case %d:\n",ii);
scanf("%d",&n);
build(1,n,1);
while(scanf("%s",s)&&s[0]!='E'){
scanf("%d%d",&ql,&qr);
if(s[0]=='Q')printf("%d\n",qu(1,n,1));
else if(s[0]=='A')add(1,n,1);
else if(s[0]=='S')qr=-qr,add(1,n,1);
}
}
}
树状数组:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
int cases,n,a[50005],c[50005];
char s[50];
int lowbit(int x){return x&(-x);}
void add(int x,int v)
{
while(x<=n)
{
c[x]+=v;
x+=lowbit(x);
}
}
int find(int x)
{
int ans=0;
while(x>0)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
scanf("%d",&cases);
for(int ii=1;ii<=cases;ii++)
{
printf("Case %d:\n",ii);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
add(i,a[i]);
}
while(scanf("%s",s)&&s[0]!='E')
{
register int xx,yy;
scanf("%d%d",&xx,&yy);
if(s[0]=='Q')
printf("%d\n",find(yy)-find(xx-1));
else if(s[0]=='A')
add(xx,yy);
else if(s[0]=='S')
add(xx,-yy);
}
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
}
}
HDU 1166 线段树模板&树状数组模板的更多相关文章
- HDU 1166 敌兵布阵 (数状数组,或线段树)
题意:... 析:可以直接用数状数组进行模拟,也可以用线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵 树状数组小结(更新)
树状数组(Binary Indexed Tree(BIT), Fenwick Tree) 是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有 元素之和,但是每次只能修改一 ...
- luogu3368树状数组模板2
题目链接:https://www.luogu.org/problemnew/show/P3368 题意:与模板1不同的是这题的操作是树状数组并不在行的区间更新和单点查找,如果按照模板1那样写肯定会T. ...
- 敌兵布阵 HDU 1166 线段树
敌兵布阵 HDU 1166 线段树 题意 这个题是用中文来描写的,很简单,没什么弯. 解题思路 这个题肯定就是用线段树来做了,不过当时想了一下可不可用差分来做,因为不熟练就还是用了线段树来做,几乎就是 ...
- hdu 1166 线段树(sum+单点修改)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 树状数组模板(pascal) 洛谷P3374 【模板】树状数组1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
- HDU - 1166 树状数组模板(线段树也写了一遍)
题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以) 思路: 树状数组的单点查询,单点修改和区间查询. 树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改.这里面用到一个 ...
随机推荐
- 20190625_mysql5.7查看及其解锁_被锁的表
[root@localhost ~]# mysql -u myroot -pEnter password: mysql> show OPEN TABLES where In_use > 0 ...
- 怎么选择最适合自己的Python培训机构?
Python培训已经成为入门Python的一个重要途径,它的优势在于学习知识的系统性.快速性和实用性.Python培训毕业的学员大多数拥有较强的实战动手能力,能够较快上手,更符合企业需求. 不过,大部 ...
- c3p0 连接池配置
C3P0 可使用properties 配置文件方式,将c3p0.properties放在classpath目录下,如果为WEB应用,放在WEB-INF\classes下 c3p0.properties ...
- 2018.03.04 晚上Atcoder比赛
C - March Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement There are N ...
- 【模板】求1~n的整数的乘法逆元
洛谷3811 先用n!p-2求出n!的乘法逆元 因为有(i-1)!-1=i!-1*i (mod p),于是我们可以O(n)求出i!-1 再用i!-1*(i-1)!=i-1 (mod p)即是答案 #i ...
- 【MFC Programming】 Using Dialog To Set A Correlate Menu
This blog will show how to display a menu we designed in a dialog. 1.Insert a new dialog& a new ...
- optimizer_index_cost_adj
Oracle在选择不同的访问路径时,会对全表扫描和索引扫描进行比较评估. 在比较的时候,Oracle会把索引扫描的成本转换为全表扫描的成本,和全表扫描的COST进行比较.这个转换需要一个转换因子. 就 ...
- log显示error时的堆栈信息理解和分析
error显示的log堆栈信息,是从最深层(最内层)的堆栈信息开始由内向外打印的. error显示的log堆栈信息,是从最深层(最内层)的堆栈信息开始由内向外打印的. error显示的log堆栈信息, ...
- array_change_key_case()
定义和用法 array_change_key_case() 函数将指定数组的所有的键进行大小写转换. 如果数组的键(索引)为数字则不发生变化.如果未提供第二个参数,则默认转换为小写. 语法 array ...
- C#和JAVA中编写事务代码
C# DAL层代码,运行多条增删改,使用事务操作: /// <summary> /// 运行 多条增删改 (非查询语句) /// </summary> /// <par ...