VIJOS-P1066 弱弱的战壕
JDOJ 1247: VIJOS-P1066 弱弱的战壕
Description
永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了--b。 mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒ftING...@@)。 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标x、y有一个小于它的点(mx:“我的战壕为什么这么菜”ToT)。这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队。 战壕都有一个保护范围,同它的攻击范围一样,它可以保护处在它左下方的战壕。所有处于它保护范围的战壕都叫做它的保护对象。这样,永恒就必须找到mx的战壕中保护对象最多的点,从而优先消灭它。 现在,由于永恒没有时间来计算,所以拜托你来完成这个任务: 给出这n个战壕的坐标xi、yi,要你求出保护对象个数为0,1,2……n-1的战壕的个数。
Input
第一行,一个正整数n(1< =n< =15000) 接下来n行,每行两个数xi,yi,代表第i个点的坐标 (1< =xi,yi< =32000) 注意:可能包含多重战壕的情况(即有数个点在同一坐标)
Output
输出n行,分别代表保护对象为0,1,2……n-1的战壕的个数。
Sample Input
5 1 1 5 1 7 1 3 3 5 5
Sample Output
1 2 1 1 0
题解:
首先我来概括一下这道题的题意:
在平面直角坐标系里,有n个点,这n个点会与原点一起构成一个矩形,问被其他矩形包含次数为1-n-1的点个数有多少。
我们考虑用树状数组的知识解决这个问题。
很容易看出来,这是一个二维的树状数组,代码大体长这个样子:
void add(int x,int y,int k)
{
for(int i=x;i<=n;i+=i&-i) //行更新
for(int j=y;j<=n;j+=j&-j) //列更新
c[i][j]+=k; //更新元素
}
int getsum(int x,int y)
{
int s=0;
for(int i=x;i;i-=i&-i)
for(int j=y;j;j-=j&-j)
s+=c[i][j];
return s;
}
但是,这个代码肯定会爆内存。
所以我们考虑压维。
不难看出,如果引入一个排序,把坐标重新排一遍,就可以简单地解决维度为二维的问题,因为坐标是有序的,我们枚举的时候就可以认为这个数组已经被我们压到了一个单纯的轴上。
所以当前的getsum(y)就表示已经插入到树状数组的战壕中,纵坐标小于等于当前y的战壕的个数。
注意它的定义,这个定义如果搞不明白就都是瞎扯。
所以我们就得出了大致的思路:
先结构体排序,然后再判重累加ans数组就可以。
注意!!
判重很重要!!!
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,ans[15001],c[32001];
struct node
{
int x,y;
}a[15001];
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int getsum(int x)
{
int ret=0;
for(int i=x;i;i-=i&-i)
ret+=c[i];
return ret;
}
void fix(int x)
{
for(int i=x;i<=32001;i+=i&-i)
c[i]++;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp);
int cnt=1;
for(int i=1;i<=n;)
{
int x=getsum(a[i].y);
while(a[i].x==a[i+cnt].x && a[i].y==a[i+cnt].y)
cnt++;
ans[x]+=cnt;
fix(a[i].y);
i+=cnt;
cnt=1;
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}
VIJOS-P1066 弱弱的战壕的更多相关文章
- Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】
弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了 ...
- 树状数组训练题1:弱弱的战壕(vijos1066)
题目链接:弱弱的战壕 这道题似乎是vijos上能找到的最简单的树状数组题了. 原来,我有一个错误的思想,我的设计是维护两个树状数组,一个是横坐标,一个是纵坐标,然后读入每个点的坐标,扔进对应的树状数组 ...
- 弱弱的玩下Javascript
前言 好久没有更新博客了,也蛮少捣弄javascript,今儿看到一个题目,关于给你一个面板,你可以随意的在上面画矩形,可以移动和删除任意一个你创建的矩形,心血来潮搞着玩哈,实现起来挺简单的,但这代码 ...
- 【vijos】P1066 弱弱的战壕
[算法]线段树 [题解]将所有坐标按x(第一)和y(第二)从小到大排序,再按顺序插入线段树,即在线段树中将y坐标位置+1,这样就能保证每个坐标能包含的点一定先被处理了,每次询问查询1...a[i].y ...
- vijos 1066 弱弱的战壕 树状数组
描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...
- [Vijos] 弱弱的战壕
描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...
- [vijos]1066弱弱的战壕<线段树>
题目链接:https://www.vijos.org/p/1066 这道题没什么难度,只是要一个排序然后就是线段树的基本套路模版了 但是我还是讲一讲思路吧: 给出的是坐标x,y,当一个点的x,y都小于 ...
- 【vijos1066】弱弱的战壕 线段树
描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...
- [vijos1066]弱弱的战壕
描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...
随机推荐
- 第01组 Beta冲刺(2/5)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11998909.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- OAuth2.0 自我领悟
grant_type 授权模式 authorization_code 标准的Server授权模式,授权码模式 password 基于用户密码的授权模式,用户密码模式 client_credential ...
- Nginx配置max_fails fail_timeout
目的: 通过配置max_fails.fail_timeout来达到当一台服务器访问出现非200时可以跳转到另一台服务器 操作: 配置nginx.conf文件 具体配置如下 upstream Site ...
- dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Gold;第一次无效
private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {}//修改DataGrid ...
- (98)address already in use: ah00072: make_sock: could not bind to address 0.0.0.0:80
(98)address already in use: ah00072: make_sock: could not bind to address 0.0.0.0:80 问题描述: 80端口已经被占用 ...
- 将Prometheus alerts保存到elasticsearch
Prometheus产生的告警通常会发送到alertmanager,当使用alertmanager时,其告警信息仅存在于alertmanager的内存中,无法持久化.故实现了小工具,用于将Promet ...
- 单点登录(sso)入门
单点登录的英文名叫做Single Sign On,简称SSO. 在以前,一般我们就单系统,所有的功能都在同一个系统上. 后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统. 比如阿里 ...
- redux的本质是一套行为解释系统
redux的本质是一套行为解释系统. 首先构建解释系统: 然后使用解释系统对行为进行解释,进而完成对store和状态的维护.
- goang学习笔记---struct
什么是结构体 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似java中的class,是golang面向对象编程的基础类型. 如何定义一个结构体 type ...
- excel中使用统计列中的值在其他列出现的次数
excel中使用统计一列的中值在其他列出现的次数 =COUNTIFS($J$:$J$,K2) 解释下 $J$2 J列中的第二行到 $J$373 J列的373行 范围内 查找 k列的第二行的值 出现的 ...