树状数组训练题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 ...
随机推荐
- 网页性能优化:防止JavaScript、CSS阻塞浏览器渲染页面
网页中引用的外部文件: JavaScritp.CSS 等常常会阻塞浏览器渲染页面.假设在 <head> 中引用的某个 JavaScript 文件由于各种不给力需要2秒来加载,那么浏览器渲染 ...
- Python+Selenium学习--窗口切换及操作元素
场景 有时候我们在测试一个web 应用时会出现多个浏览器窗口的情况,在selenium1.0 中这个问题比较难处理.webdriver 提供了相关相方法可以很轻松的在多个窗口之间切换并操作不同窗口上的 ...
- 填坑专记-手脱FSG壳
妈呀,脱FGS壳真的是坎坷颇多,多亏吾爱破解前辈们的帮忙.我一定要记录下来,省的以后再无法解决. 已经查看是FSG壳了.找到入口也容易了.重点就是脱壳并修复好它. 脱壳 OEP为: 使 ...
- Disruptor并发框架简介
Martin Fowler在自己网站上写一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金额交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一个业务逻辑处 ...
- echarts横向柱状图如果想打开网址
代码: var data = eval(data); var xList = new Array(); var yList = new Array(); var urlList = new Array ...
- 关于json.stringify的注意事项
今天通过navigator.getCurrentPosition中的success回调,用json.stringify打印postion时,怎么打印都只是一个{}, 而打印postion.coords ...
- 42-字符串到json 的错误 com.alibaba.fastjson.JSONObject cannot be cast to java.lang.String
json: {"updated_at":1551780617,"attr":{"uptime_h":3,"uptime_m&quo ...
- vue总结2
1. 给router-link添加事件 之前用v-link 现在用 router-link 添加事件要用原生的.native修饰v-on <my-component v-on:click.nat ...
- 为什么使用Reazor
原因:类似于前边写的模板页,自己写了.还需要用replace来替换成自己想要的变量.. 常见的模板引擎:Razor.Nvelocity.Vtemplate. Razor有VS自动提示,而且有助于学习a ...
- 字典的增删改查 daty 5
字典:python中非常重要的数据类型,在python中唯一一个映射的数据类型数据类型分类 按照数据可变与不可变: # 不可变数据类型: int str bool tuple # 可变数据类型: li ...