随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾

例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

例题:hdu 1166

敌兵布阵

                          Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Problem Description
  C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.
 
Input
  第一行一个整数T,表示有T组数据。 每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。 接下来每行有一条命令,命令有4种形式:
      (1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30;
      (2) Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
      (3) Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
      (4) End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令
 
Output
  对第i组数据,首先输出“Case i:”和回车, 对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。
树状数组(BIT)代码:
 #include "stdio.h"
#include "string.h"
#define N 50005 int n;
int a[N],c[N]; int lowbit(int x){ return x&(-x); } int Query(int x)
{
int sum = ;
for(int i=x; i>; i-=lowbit(i))
sum += c[i];
return sum;
} int main()
{
int T;
int i,j,Case=;
char str[];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(a,,sizeof(a));
memset(c,,sizeof(c));
for(i=; i<=n; i++)
{
scanf("%d",&a[i]);
for(j=i; j<=n; j+=lowbit(j))
c[j] += a[i];
}
printf("Case %d:\n",Case++);
while(scanf("%s",str),strcmp(str,"End")!=)
{
scanf("%d %d",&i,&j);
if(strcmp(str,"Add")==)
{
a[i] += j;
for(int k=i; k<=n; k+=lowbit(k))
c[k] += j;
}
else if(strcmp(str,"Sub")==)
{
a[i] -= j;
for(int k=i; k<=n; k+= lowbit(k))
c[k] -= j;
}
else
printf("%d\n",Query(j) - Query(i-));
}
}
return ;
}
线段树代码:
 #include "iostream"
#include "cstdio"
#include "cstring"
using namespace std;
#define N 50005
struct point
{
int l,r;
int sum;
}Tree[N*]; void Build(int t,int l,int r)
{
Tree[t].l = l;
Tree[t].r = r;
Tree[t].sum = ;
if(Tree[t].l == Tree[t].r)
{
scanf("%d",&Tree[t].sum);
return ;
}
int mid = (l+r)/;
Build(t<<,l,mid);
Build(t<<|,mid+,r);
Tree[t].sum = Tree[t<<].sum + Tree[t<<|].sum;
} void Add(int t,int l,int r)
{
if(Tree[t].l==Tree[t].r && Tree[t].l==l)
{
Tree[t].sum += r;
return ;
}
int mid = (Tree[t].l+Tree[t].r)/;
if(l <= mid)
Add(t<<,l,r);
else
Add(t<<|,l,r);
Tree[t].sum = Tree[t<<].sum + Tree[t<<|].sum;
}
int Query(int t,int l,int r)
{
if(Tree[t].l==l && Tree[t].r==r)
{
return Tree[t].sum;
}
int mid = (Tree[t].l + Tree[t].r)/;
if(r <= mid)
return Query(t<<,l,r);
else if(l > mid)
return Query(t<<|,l,r);
else
return Query(t<<,l,mid) + Query(t<<|,mid+,r);
} int main()
{
int T;
int iCase = ;
scanf("%d",&T);
while(T--)
{
int n;
iCase++;
printf("Case %d:\n",iCase);
scanf("%d",&n);
Build(,,n);
char str[];
getchar();
while(scanf("%s",str) && strcmp(str,"End")!=)
{
int x,y;
scanf("%d %d",&x,&y);
if(strcmp(str,"Query")==)
{
printf("%d\n",Query(,x,y));
}
else if(strcmp(str,"Add")==)
{
Add(,x,y);
}
else if(strcmp(str,"Sub")==)
{
Add(,x,-y); }
}
}
return ;
}
												

数据结构--树状数组&&线段树--基本操作的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

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

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)

    学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...

  7. 【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)

    题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道 ...

  8. CodeForces–830B--模拟,树状数组||线段树

    B. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  9. BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...

随机推荐

  1. Websocket 概述

    WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). [[ from websocket是什么原理? ]] 一.WebSocke ...

  2. Dev gridView中设置自适应列宽和日期显示格式、金额的显示格式

    在Dev GridView控件中,数据库中表数据日期都是长日期格式(yyyy-MM-dd HH:mm:ss),但显示在控件变成短日期格式(yyyy-MM-dd),金额显示要显示精确的数值, 比如80. ...

  3. csharp:正则表达式采集网页数据

    https://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex(v=vs.110).aspx https:/ ...

  4. Studio for Winforms FlexGrid:导出到 PDF 文件

    本篇文章主要介绍如何导出 FlexGrid 到 PDF 格式文件.本文源于论坛用户,有多个用户提出如何把 FlexGrid 导出到 PDF 文件的需求.在这里共享给大家. 当前,ComponentOn ...

  5. 变废为宝,将Discuz废弃的cache机制引入到memory体系中

    Discuz的source/class/cache目录,代表着相应的缓存机制,但实际上废弃很多年了. Discuz用Memory代表了缓存,里面内置了memcache等多种缓存驱动. 但很多人的开发环 ...

  6. android dp

    http://www.see-say.com/viewnews-47657.html http://cn.club.vmall.com/thread-970026-1-1.html http://ww ...

  7. Android小项目合集(经典教程)包含十五个Android开发应用实例

    http://www.cnblogs.com/aimeng/archive/2012/03/28/2422435.html

  8. mysql服务器的字符集

    文章:http://www.cnblogs.com/fantiantian/p/3468454.html 的评论中有这样的文字: 谢谢沧海一滴的总结 在Linux中一般都是UTF-8字符集.我们在建数 ...

  9. 2015年第8本(英文第7本):the city of ember 微光城市

    书名:the City of Ember(中文名:微光城市) 作者:Jeanne DuPrau 单词数:6.2万 不重复单词数:未知 首万词不重复单词数:未知 蓝思值:未知 阅读时间:2015年4月2 ...

  10. Python数据结构与算法--List和Dictionaries

    Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...