• [FZYZOJ 1003] 弱弱的战壕


    P1003 -- 弱弱的战壕

    时间限制:1000MS

    内存限制:65536KB

    Description

    永恒和lmx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b。

    mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“lmx不赢定了?!?”永恒ftING...@_@)。 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT)。这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭lmx的部队。

    战壕都有一个保护范围,同它的攻击范围一样,它可以保护处在它左下方的战壕。所有处于它保护范围的战壕都叫做它的保护对象。这样,永恒就必须找到lmx的战壕中保护对象最多的点,从而优先消灭它。

    现在,由于永恒没有时间来计算,所以拜托你来完成这个任务: 给出这n个战壕的坐标xi、yi,要你求出保护对象个数为0,1,2……n-1的战壕的个数。

    Input Format

    第一行,一个正整数n(1<=n<=100000)

    接下来n行,每行两个数xi,yi,代表第i个点的坐标 (1<=xi,yi<=32768)

    注意:可能包含多重战壕的情况(即有数个点在同一坐标)

    Output Format

    输出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
    

    Hint

    数据已更新 2014.10

    【题解】

    先按照x坐标排个序,再根据y坐标建立树状数组优化

    加读入优化0.28s,不加读入优化0.47s,所以,加上一点读入优化还是挺有必要的= =

    TAT看到以前的代码,暴力50分QAQ。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,d[33005];
     4 int MAX=33001;
     5 struct P {
     6     int x,y;
     7 }p[100001];
     8 int ans[100001];
     9 int read() {
    10     int x=0,f=1;
    11     char ch=getchar();
    12     while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
    13     while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    14     return x*f;
    15 }
    16 bool cmp(P u,P v) {return (u.x<v.x)||(u.x==v.x&&u.y<v.y);}
    17 inline int lowbit(int x) {return x&(-x);}
    18 inline void add(int a,int v) {
    19     if(a<=0) return; 
    20     while(a<MAX) d[a]+=v,a+=lowbit(a);
    21 }
    22 inline int sum(int a) {
    23     if(a<=0) return 0;
    24     int ret=0;
    25     while(a>0) ret+=d[a],a-=lowbit(a);
    26     return ret;
    27 }
    28 int main() {
    29     int n;
    30     n=read();
    31     for (int i=1;i<=n;++i) p[i].x=read(),p[i].y=read();
    32     sort(p+1,p+n+1,cmp);
    33     int cnt=1;
    34     for (int i=1;i<=n;++i) {
    35         if (p[i].x==p[i+1].x && p[i].y==p[i+1].y) {++cnt;continue;}
    36         ans[sum(p[i].y)+cnt-1]+=cnt;
    37         add(p[i].y,cnt);
    38         cnt=1;
    39     }
    40     for (int i=0;i<n;++i) printf("%d
    ",ans[i]);
    41     return 0;
    42 }
    View Code
    这篇文章由TonyFang发布。 所有解释权归TonyFang所有。 Mailto: tony-fang@map-le.net
  • 相关阅读:
    SDL 开发实战(三):使用 SDL 绘制基本图形
    SDL 开发实战(二):SDL 2.0 核心 API 解析
    SDL 开发实战(一):SDL介绍及开发环境配置
    开源播放器 ijkplayer (六) :Android 下使用 ijkplayer 异常处理思路
    音视频编解码技术(二):AAC 音频编码技术
    FFmpeg开发实战(五):FFmpeg 抽取音视频的视频数据
    FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据
    FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息
    FFmpeg开发实战(二):FFmpeg 文件操作
    FFmpeg开发实战(一):FFmpeg 打印日志
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/fzyzoj1003.html
Copyright © 2020-2023  润新知