树状数组训练题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 ...
随机推荐
- jenkins权限控制
一.插件安装 插件:Role-based Authorization Strategy版本:2.3.2 二.全局安全配置 进入Jenkins后点击系统管理进入全局安全配置 当插件安装好的时候,授权策略 ...
- 忘记root密码,怎么办
当前账户拥有sudo权限,可以通过sudo passwd root来重置root密码.
- poj 2553 缩点+染色+出度
题目链接:https://vjudge.net/problem/POJ-2553 如果不会tarjan算法,推荐博客:https://blog.csdn.net/mengxiang000000/art ...
- poj 1789 prime
链接:Truck History - POJ 1789 - Virtual Judge https://vjudge.net/problem/POJ-1789 题意:先给出一个n,代表接下来字符串的 ...
- robotium—只有apk文件的测试
把ppt的内容总结一下,并把问题说明一下: 把基本步骤搞出来,用notepad的程序吧,直接安装apk,就当做是不知道源码就好啦! 直接用自己的手机上就行啦!! 一.重签名: 步骤: 1.直接运行re ...
- js中json知识点
首先,json是一种数据格式,而不能说是一种对象(object).这一点是非常重要的. 起源是不同的语言中数据对象的形式是不一样的,我们为了在不同的语言中传递数据,发明了一种json格式用于消除这种差 ...
- DataTable 作为ObjectDataSource的数据源
好像是不能直接实现的.不过我从网上找到了这样的方法: 比如在BLL层中,SubjectManager是我对Subject表的业务类,此类中包含了Subject表的增删改查等各种方法.在aspx 页面中 ...
- linux命令学习之:mv
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 命令格式 mv [选项] 源文件或目 ...
- 33-Java中的String,StringBuilder,StringBuffer三者的区别
转载自:https://www.cnblogs.com/su-feng/p/6659064.html StringBuilder 详解 (String系列之2) Java中的String,String ...
- 进程 day36
python之路——进程 阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multipro ...