树状数组训练题1:弱弱的战壕(vijos1066)
题目链接:弱弱的战壕
这道题似乎是vijos上能找到的最简单的树状数组题了。
原来,我有一个错误的思想,我的设计是维护两个树状数组,一个是横坐标,一个是纵坐标,然后读入每个点的坐标,扔进对应的树状数组内,然后计算时,只要以当前点的坐标为末点求前缀和,在两个前缀和中取最小的一个即可。
但是这个想法很明显有错误比如如图的状况:
此时,在计算1点时,两个的前缀和均为1,但事实上,1点能保护的点为0个。
那么我们应该怎么去解这道题呢?
其实也很简单,我们只维护一个树状数组,
首先我们先把点排序,以y为主关键字,x为副关键字,从小到大排序。
然后我们从排序后的第一个点开始计算,我们求一下以当前点的x坐标为末点的前缀和,这就是当前保护的数量,然后在把当前的这个x坐标扔进树状数组。
为什么这么做是正确的?
这很简单,求x的前缀和,保证得出的都是小于x的点,而按y的顺序枚举,横坐标大于等于当前y的点还没放入(我们是计算完才放入的),这样就保证了我们得出的数是我们期望求的。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int xvis[32002];
int n;
struct point{
int x,y;
};
int cmp(point a,point b){
if(a.y!=b.y){
return a.y<b.y;
}else{
return a.x<b.x;
}
}
point pp[32002];
int lowbit(int x){
return x&(-x);
}
void add(int x,int p){
while(x<=32000){
xvis[x]+=p;
x+=lowbit(x);
}
}
int sum(int x){
int ans=0;
while(x>0){
ans+=xvis[x];
x-=lowbit(x);
}
return ans;
}
int vis[15001];
int main(){
memset(xvis,0,sizeof(xvis));
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&pp[i].x,&pp[i].y);
}
memset(vis,0,sizeof(vis));
sort(pp,pp+n,cmp);
for(int i=0;i<n;i++){
int ans=sum(pp[i].x);
add(pp[i].x,1);
vis[ans]++;
}
for(int i=0;i<n;i++){
printf("%d",vis[i]);
if(i!=n-1){
printf("\n");
}
}
return 0;
}
树状数组训练题1:弱弱的战壕(vijos1066)的更多相关文章
- 树状数组训练题2:SuperBrother打鼹鼠(vijos1512)
先给题目链接:打鼹鼠 这道题怎么写? 很明显是树状数组. 而且,很明显是二维树状数组. 如果你没学过二维的树状数组,那么戳开这里:二维树状数组 看完以后,你就会知道怎么做了. 没有什么好解释的,几乎就 ...
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- st表树状数组入门题单
预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...
- bzoj1103树状数组水题
(卧槽,居然规定了修改的两点直接相连,亏我想半天) 非常水的题,用dfs序(而且不用重复,应该是直接规模为n的dfs序)+树状数组可以轻松水 收获:树状数组一遍A(没啥好骄傲的,那么简单的东西) #i ...
- UESTC 1584 Washi与Sonochi的约定【树状数组裸题+排序】
题目链接:UESTC 1584 Washi与Sonochi的约定 题意:在二维平面上,某个点的ranked被定义为x坐标不大于其x坐标,且y坐标不大于其y坐标的怪物的数量.(不含其自身),要求输出n行 ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
- 树状数组 简单题 cf 961E
题目链接 : https://codeforces.com/problemset/problem/961/E One day Polycarp decided to rewatch his absol ...
- 【树状数组 思维题】luoguP3616 富金森林公园
树状数组.差分.前缀和.离散化 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积 ...
- Lightoj 1112 - Curious Robin Hood 【单点改动 + 单点、 区间查询】【树状数组 水题】
1112 - Curious Robin Hood PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 MB ...
随机推荐
- 数位dp poj1850
题目链接:https://vjudge.net/problem/POJ-1850 这题我用的是数位dp,刚刚看了一下别人用排列组合,我脑子不行,想不出来. 在这题里面我把a看成1,其他的依次递增,如果 ...
- 使用phpStudy运行伊人集项目
1.首次运行时,需要把system/config/install.look.php以及system/config/database.php(后面这个文件可以先不删除,若是安装过程中数据库报错,再来删除 ...
- 设置获取cookie,setCookie,getCookie
设置cookie: function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getT ...
- TOJ4127: Root of String
传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4127 4127: Root of ...
- Bitmap byte[] InputStream Drawable 互转
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStrea ...
- mysql数据库分区及测试
1. 测试数据库是否支持分区 mysql可以通过下面语句判断是否支持分区: SHOW VARIABLES LIKE '%partition%'; 如果输出:have_partitioning YE ...
- Android模拟器故障:waiting for target deviceto come online
关闭再打开模拟器.删除再新建模拟器均无效. 解决办法:在AVD Manager中,选择立即冷启动(Cold Boot Now)模拟器.
- Linux系统声卡问题
问题:Linux系统中有声卡设备,但是听不到声音 一.声卡驱动没有安装 1.通过插拔声卡查出声卡驱动 2.在相应的kernel中编译内核 修改保存.config文件,然后进行编译 make -j ma ...
- 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量
原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为 aB , 驼峰命名就可以了.
- YII2中验证码的使用
验证码的使用是比较频繁的.YII2中已经帮我们做好了封装. 首先我们在控制器里创建一个actions方法,用于使用yii\captcha\CaptchaAction <?php namespac ...