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 弱弱的战壕的更多相关文章

  1. Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

    弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了 ...

  2. 树状数组训练题1:弱弱的战壕(vijos1066)

    题目链接:弱弱的战壕 这道题似乎是vijos上能找到的最简单的树状数组题了. 原来,我有一个错误的思想,我的设计是维护两个树状数组,一个是横坐标,一个是纵坐标,然后读入每个点的坐标,扔进对应的树状数组 ...

  3. 弱弱的玩下Javascript

    前言 好久没有更新博客了,也蛮少捣弄javascript,今儿看到一个题目,关于给你一个面板,你可以随意的在上面画矩形,可以移动和删除任意一个你创建的矩形,心血来潮搞着玩哈,实现起来挺简单的,但这代码 ...

  4. 【vijos】P1066 弱弱的战壕

    [算法]线段树 [题解]将所有坐标按x(第一)和y(第二)从小到大排序,再按顺序插入线段树,即在线段树中将y坐标位置+1,这样就能保证每个坐标能包含的点一定先被处理了,每次询问查询1...a[i].y ...

  5. vijos 1066 弱弱的战壕 树状数组

    描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...

  6. [Vijos] 弱弱的战壕

    描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...

  7. [vijos]1066弱弱的战壕<线段树>

    题目链接:https://www.vijos.org/p/1066 这道题没什么难度,只是要一个排序然后就是线段树的基本套路模版了 但是我还是讲一讲思路吧: 给出的是坐标x,y,当一个点的x,y都小于 ...

  8. 【vijos1066】弱弱的战壕 线段树

    描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...

  9. [vijos1066]弱弱的战壕

    描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...

随机推荐

  1. oracle--介质恢复和实例恢复的基本概念

    1.概念 REDO LOG是Oracle为确保已经提交的事务不会丢失而建立的一个机制.实际上REDO LOG的存在是为两种场景准备的,一种我们称之为实例恢复(INSTANCE RECOVERY),一种 ...

  2. STM32Cube在Main里判断USB是否已连接到电脑

    首先添加这两个Includes: #include "usbd_def.h" #include "usbd_hid.h" 然后就可以在代码里用这个来判断是否有连 ...

  3. 论文阅读: Direct Monocular Odometry Using Points and Lines

    Direct Monocular Odometry Using Points and Lines Abstract 大多数VO都用点: 特征匹配 / 基于像素intensity的直接法关联. 我们做了 ...

  4. HTML+css基础 Text文本属性

    Text文本属性: 1.颜色  color color:red 2.文本缩进 text-indent 属性值 数字+px: text-indent:10px: 3.文本修饰 text-decorati ...

  5. 关于 Task.Run 简单的示例

    1. 关于 Task.Run 简单的示例01 直接贴代码了: public static class TaskDemo01 { public static void Run() { Console.W ...

  6. Qt 的两个许可证区别分析:LGPL 和商业协议

    Qt 的两个许可证区别分析:LGPL 和商业协议 Qt 有两个许可证:LGPL 和商业协议.这两个协议在现在的 Qt 版本中的代码是完全一致的(潜在含义是,Qt 的早期版本,商业版的 Qt 通常包含有 ...

  7. 【08】Jenkins:关于发布

    写在前面的话 Jenkins 对于我们用户而言,可能中间会有不同的需求,比如自动构建,接口测试,代码质量检测.但其实我们的最终目的还是打包上线.当然,各个公司的项目开发语言会不一样,但是总体而言发布方 ...

  8. 深入V8引擎-引擎内部类管理解析

    v8的初始化三部曲,前面花了三篇解决了第一步,由于只是生成了一个对象,第二步就是将其嵌入v8中,先看一下三个步骤. // 生成默认Platform对象 std::unique_ptr<v8::P ...

  9. excel中统计列中的值在其他列出现的次数多个条件

    excel中统计列中的值在其他列出现的次数多个条件 =COUNTIFS(E2:E373,"=VIP经销商",J2:J373,K2) 解释 E列的第二行到第373行中值 等于 VIP ...

  10. WPF 精修篇 调用Win32Api

    原文:WPF 精修篇 调用Win32Api 栗子是 调用WIn32API 让窗口最前 后台代码 [DllImport("user32.dll")] private static e ...