【例1】数星星

天空中有一些星星,这些星星都在不同的位置,每个星星都有个坐标,如果一个星星的左下方(包括正左和正下)有k颗星星,就说这颗星星是k级的。

比如,上图中,星星5是3级的(1,2,4在其左下方)

2,4是1级的。

给定星星的位置,输出各级星星的数目。

简述:先按y坐标来排序,就用x来作为参考用树状数组来求解答案(前缀和)

代码

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=;
const int MAXX=;
struct node{
int x,y;
}p[MAXN];
int n,m=MAXX,c[MAXX],ans[MAXX];
int lowbit(int x){
return x&(-x);
}
void update(int x,int y){
while(x<=m)c[x]+=y,x+=lowbit(x);
}
int sum(int x){
int tot=;
while(x){
tot+=c[x];
x-=lowbit(x);
}
return tot;
}
int main(){
cin>>n;
for(int i=;i<=n;++i)cin>>p[i].x>>p[i].y;
for(int i=;i<=n;++i){
int u=p[i].x+;
int v=sum(u);
update(u,);
ans[v]++;
}
for(int i=;i<n;++i)cout<<ans[i]<<endl;
}

【例2】校门外的树2

校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l、r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同K=2,读入l,r表示询问l~r之间能见到多少种树(l,r>0)

简述:这题不能用暴力的方法。所以我们将线段看成括号序列(即左右打上标记,由此就是范围内有一种树),再用前缀和求解。

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=;
int n,c_1[MAXN],m,c_2[MAXN];
inline int lowbit(int x){
return x&(-x);
}
void update_1(int x,int y){
for(;x<=n;x+=lowbit(x))c_1[x]+=y;
}
void update_2(int x,int y){
for(;x<=n;x+=lowbit(x))c_2[x]+=y;
}
int sum_1(int x){
int res=;
for(;x;x-=lowbit(x))res+=c_1[x];
return res;
}
int sum_2(int x){
int res=;
for(;x;x-=lowbit(x))res+=c_2[x];
return res;
}
int main(){
cin>>n>>m;
for(int i=;i<=m;++i){
int k,l,r;
cin>>k>>l>>r;
if(k==)update_1(l,),update_2(r,);
else printf("%d\n",sum_1(r)-sum_2(l-));
}
}

【例3】清点人数

初始时,火车上没有学生;当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第m节车厢时,他想知道第1到m这m节车厢上一共有多少学生,但是他没有调头往回走的习惯.也就是说每次当他提问时,m总会比前一次大。

第一行两个整数n,k,表示火车共有n节车厢以及k个事件。接下来有k行,按时间先后给出k个事件,每行开头都有一个字母A,B或C,如果字母为A,接下来是一个数m,表示年级主任现在在第m节车厢;如果为B,接下来两个数m,p,表示在第m节车厢有p名学生上车;如果为C,接下来两个数m,p,表示在第m节车厢有p名学生下车。学生总人数不会超过100000。

简述:板子题,树状数组求解。

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=;
int n,c[MAXN],m;
inline int lowbit(int x){
return x&(-x);
}
void update(int x,int y){
for(;x<=n;x+=lowbit(x))c[x]+=y;
}
int sum(int x){
int res=;
for(;x;x-=lowbit(x))res+=c[x];
return res;
}
int main(){
cin>>n>>m;
for(int i=;i<=m;++i){
int a,b;
char k[];
scanf("%s %d",k,&a);
if(k[]=='A')cout<<sum(a)<<endl;
else if(k[]=='B'){
scanf("%d",&b);
update(a,b);
}
else{
scanf("%d",&b);
update(a,-b);
}
}
}

【例4】简单题easy

有一个n个元素的数组,每个元素初始均为0。有m条指令,要么让其中一段连续序列数字反转——0变1,1变0(操作1),要么询问某个元素的值(操作2)。

第一行包含两个整数n,m,表示数组的长度和指令的条数,以下m行,每行的第一个数t表示操作的种类。若t=1,则接下来有两个数L, R (L<=R),表示区间[L, R]的每个数均反转;若t=2,则接下来只有一个数I,表示询问的下标。

简述:跟校门外的树差不多,都是用双端打标记。这次标记的是区间内修改次数,修改奇数次答案为1,偶数次为0

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=;
int n,c_1[MAXN],m,c_2[MAXN];
inline int lowbit(int x){
return x&(-x);
}
void update_1(int x,int y){
for(;x<=n;x+=lowbit(x))c_1[x]+=y;
}
void update_2(int x,int y){
for(;x<=n;x+=lowbit(x))c_2[x]+=y;
}
int sum_1(int x){
int res=;
for(;x;x-=lowbit(x))res+=c_1[x];
return res;
}
int sum_2(int x){
int res=;
for(;x;x-=lowbit(x))res+=c_2[x];
return res;
}
int main(){
cin>>n>>m;
for(int i=;i<=m;++i){
int k,l,r;
cin>>k>>l;
if(k==){
cin>>r;
update_1(l,),update_2(r,);
}
else{
int u=sum_1(l)-sum_2(l-);
printf("%d\n",u%);
}
}
}

树状数组例题-数星星,简单题easy,校门外的树2,清点人数的更多相关文章

  1. 【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)

    第一部分---线段树:https://leetcode.com/tag/segment-tree/ [218]The Skyline Problem [307]Range Sum Query - Mu ...

  2. 【树状数组】BZOJ3132 上帝造题的七分钟

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1004  Solved: 445[Submit][Status][Dis ...

  3. hdu 2642二维树状数组 单点更新区间查询 模板题

    二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...

  4. POJ2155/LNSYOJ113 Matrix【二维树状数组+差分】【做题报告】

    这道题是一个二维树状数组,思路十分神奇,其实还是挺水的 题目描述 给定一个N∗NN∗N的矩阵AA,其中矩阵中的元素只有0或者1,其中A[i,j]A[i,j]表示矩阵的第i行和第j列(1≤i,j≤N)( ...

  5. CF E. Vasya and a Tree】 dfs+树状数组(给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

  6. luogu P4769 [NOI2018]冒泡排序 结论 树状数组 卡特兰数

    LINK:冒泡排序 神题. 可以想到爆搜 期望得分5~10分. 打成这个样子心态不得爆炸? 仔细分析 一个不合法序列还有什么标志. 容易想到某个数字离自己位置相反的方向多走了一步. 考虑单独对每个数字 ...

  7. BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*

    BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...

  8. POJ - 2464 Brownie Points II 【树状数组 + 离散化】【好题】

    题目链接 http://poj.org/problem?id=2464 题意 在一个二维坐标系上 给出一些点 Stan 先画一条过一点的水平线 Odd 再画一条 过Stan那条水平线上的任一点的垂直线 ...

  9. 二维树状数组(水题) POJ1195

    前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用 ...

随机推荐

  1. Word 查找替换高级玩法系列之 -- 通配符大全A篇

    1. 通配符大全一览 序号 特殊字符(不使用通配符) 代码(不使用通配符) 特殊字符(使用通配符) 代码(使用通配符) 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^### 任意数字(单个 ...

  2. Python列表生成式测试

    print('*'*50) list1 = list(range(1,6)) print(list1) del(list1) #range(1,20) 按顺序生成列表 list1 = [] for x ...

  3. 00 Python的变量

    变量分类 a.全局变量:在模块内.在所有函数外面.在class外面,这就是全局变量. b.局部变量:在函数内.在class的方法(构造.类方法.静态方法.实例方法)内(变量未加self修饰),这就是局 ...

  4. PAT甲级题分类汇编——序言

    今天开个坑,分类整理PAT甲级题目(https://pintia.cn/problem-sets/994805342720868352/problems/type/7)中1051~1100部分.语言是 ...

  5. Luogu5280 [ZJOI2019] 线段树 【线段树】

    题目分析: 这题除了分类讨论就没啥了... 容易发现问题实际就是所有操作选和不选按顺序执行的所有答案和.考虑每个点在多少种情况下会有tag. 那么,考虑新插入一个[l,r],所有有交集的点都会被清空, ...

  6. java使用AES-256-ECB(PKCS7Padding)解密——微信支付退款通知接口指定解密方式

    1.场景 在做微信支付退款通知接口时,微信对通知的内容做了加密,并且指定用 AES256 解密,官方指定的解密方式如下: 2.导包 <!-- https://mvnrepository.com/ ...

  7. jQuery AJAX基础

    一.JSON 定义:             JSON(JavaScript Object Notation, JS对象标记)是一种轻量级的数据交换格式.         它基于 ECMAScript ...

  8. 无限重启:windows更新之后,在输入密码页面无限重启进入不了系统

    解决办法:windows更新之后,在输入密码页面无限重启 总体思路:进入安全模式(如何进入,下文将讲述)  -->   点击疑难解答   -->   点击高级选项  -->  点击启 ...

  9. K2 BPM_规范内部供应链流程,提高企业整体绩效_工作流流程管理

    方案背景 随着企业竞争的加剧.顾客需求的多样化以及市场变化的不确定因素增多,企业与企业间的竞争已经逐步转变为供应链与供应链间的竞争.企业只有在内部各业务流程有机统一的状态下,再与外部企业进行融合与协作 ...

  10. [LeetCode] 45. Jump game II ☆☆☆☆☆(跳跃游戏 2)

    https://leetcode-cn.com/problems/jump-game-ii/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-b ...