HDU5200 Trees (离线处理)

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5200

题意:

每次去掉高度小于q的树,每次输出剩下的块数。

分析:

我们对高度从高到低进行排序,对要去掉的高度从低到高进行排序。

因此前面去掉的在后面一定会去掉,因可以离线处理,节省时间,

然后需要开一个辅助空间,记录这棵树去没有去掉。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
using namespace std;

const int maxn = 50010;

int vis[maxn],ans[maxn];

struct tree{
    int h,id;
    bool operator <(const struct tree &tmp) const{
        return h > tmp.h;
    }
}p[maxn];

struct query{
    int h,id;
    bool operator <(const struct query &tmp) const{
        return h<tmp.h;
    }
}q[maxn];

inline int S(){
    int ret=0,ok=0;
    char c;
    while((c=getchar()))
    {
        if(c>='0'&&c<='9')
        ret=ret*10+c-'0',ok=1;
        else if(ok)
        return ret;
    }
    return ret;
}

int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<n;i++){
            p[i].h=S();
            p[i].id=i+1;
        }
        sort(p,p+n);
        for(int i=0;i<m;i++){
            q[i].h=S();
            q[i].id=i+1;
        }
        sort(q,q+m);
        int tot = 0;
        memset(vis,0,sizeof(vis));
        for(int i = 0,j = m-1;j>=0;j--){
            for(;i<n;i++){
                if(p[i].h<=q[j].h)
                    break;
                vis[p[i].id]=1;
                if(!vis[p[i].id-1]&&!vis[p[i].id+1]) tot++;
                else if(vis[p[i].id-1]&&vis[p[i].id+1]) tot--;
            }
            ans[q[j].id]=tot;
        }
        for(int i=0;i<m;i++)
            printf("%d\n",ans[i+1]);
    }
    return 0;
}
时间: 2024-10-13 16:50:08

HDU5200 Trees (离线处理)的相关文章

hdu5200 Trees(逆向思维+离线处理)

题意描述: 在一条直线上有n棵树,每棵树有一个高度.现在进行查询:给一个高度h,把小于等于h的树砍掉,剩余的树能组成几个块? 块的定义:一个块要包含尽可能多的位置连续的树,而且被包含的树没有被砍掉 解题思路:离线处理 1.逆向思维:砍树的对立面就是长树 (1)如果我们把树的高度和查询高度都按从大到小的顺序排序,初始化直线上没有一棵树存在: (2)然后从前往后扫描查询,对于当前查询,我们只需要把高于当前查询的树生长出来(vis数组标记即可) (3)在每颗树生长的同时检测其两边的树是否已经生长,对于

HDU5200 数据离线处理

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5200 ,数据离线处理. 这是BestCoder Round #36的C题,比赛时自己用线段树做,姿势不够优美,TLE了,后来才想到用离线处理的话很简单. 解法: 先把所有的树的高度和下标都存下来,然后按照高度进行排序:接下来把所有询问都先存下来,按照询问的高度进行排序.对于当前的查询h,在树中删除比h小的树木,假设删除的树的下标为p,则查看当前p+1和p-1位置的树木是否删去,如果两个位置都在,则+

BestCoder Round #36 (hdu5200)Strange Class(离线)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Today CodeFamer is going to cut trees.There are N trees standing in a line. They

hdu 5200 Trees [ 排序 离线 2指针 ]

传送门 Trees Accepts: 156 Submissions: 533 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description Today CodeFamer is going to cut trees.There are N trees standing in a line. They are numbered from 1 to N. Th

[hdu5200]离线+标记

思路:按顺序处理,新建一堆然后向左右合并,不过巧妙地用了标记数组来记录和统计答案. 1 #pragma comment(linker, "/STACK:10240000,10240000") 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <cstring> 8 #include

Hdu 5200 Trees (离线线段树)

题目大意: 校门外栽满了不同高度的树,每一次询问是 如果砍掉所有高度不超过q的树,那么还有多少个连续的块. 思路分析: 记录左连续和   右连续和  用来维护区间的连续块的数量. 即 seg[num] = seg[num<<1]+seg[num<<1|1] ; 如果中间部分连起来  那么减一即可. #include <cstdio> #include <iostream> #include <cstring> #include <algor

集成Android免费语音合成功能(在线、离线、离在线融合)

集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线)集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年没写文章了,没什么理由,就是人变懒了.囧~ 看标题,其实大家都被骗了,有这一篇文章还不够,我其实是打算分3篇文章来写的,如果合在一章里面就太长了,不过现在这个标题党横行的网络世界,我也被污染了,哈.那么为什么要分3篇文章来讲呢?看标题也能猜到了,就是在线.离线.离在线融合这3种语音合成方式,我将分别使

架构师之路--视频业务介绍,离线服务架构和各种集群原理

先聊聊业务.我们媒资这边目前的核心数据是乐视视频的乐视meta和专门存储电视剧,综艺节目,体育赛事这种长视频的作品库.乐视视频的数据都是多方审核的,需要很多运营.但是作品库部分却是弱运营的,运营都不超过10个人.结果做了两个app,日活都有四五百万的样子.我们其实都有各样的技术储备,很容易可以抓取人家数据,自己套上一个壳子在线解码.但是我们逼格很高,都不这么做的.乐视是个非常注重版权的公司.我名下都有近百个专利了. 撇开这个项目,先看这边一般web项目的常用JVM配置. <jvm-arg>-X

Firefox 离线软件下载地址

分享一个firefox 各种语言和各种平台的离线下载地址. https://www.mozilla.org/en-US/firefox/all/