【BZOJ3888】【Usaco2015 Jan】Stampede 线段树判区间覆盖

广告:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44066313");
}

题意:

PoPoQQQ站在原点上向y轴正半轴看,然后有一群羊驼从他眼前飞过。这些羊驼初始都在第二象限,尾巴在(Xi,Yi),头在(Xi+1,Yi),每Ci秒向右走一个单位。

PoPoQQQ能看见一匹羊驼当且仅当它身体任意某部位x坐标为0时,没有其它y坐标小于此羊驼的羊驼身体某部位x坐标为0。

问PoPoQQQ能看见几匹羊驼?

题解:

离散化一下看每头羊驼跨越y轴的时间左端点、右端点。

然后按y坐标排序后挨个去线段树里扫看是否被完全覆盖。

注意:

[3,4]以及[4,5]被覆盖不代表[4]被覆盖了

所以离散化时的取值略加修改。

WA:if(i==1||lsh[i].x!=lsh[i-1].x)m++;

AC :if(i==1||lsh[i].x!=lsh[i-1].x)m+=2;

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 50500
#define ls (note<<1)
#define rs (note<<1|1)
using namespace std;
struct LSH
{
    long long l,r,x;
    bool operator < (const LSH &a)const{return x<a.x;}
    LSH(long long _l=0,long long _r=0,long long _x=0):l(_l),r(_r),x(_x){}
}lsh[N*2],q[N];
int n,m,cnt;
struct Segment_Tree
{
    int l,r,c;
}s[N*6*4];
void pushup(int note)
{
    s[note].c=s[note].c|(s[ls].c&s[rs].c);
}
void build(int note,int l,int r)
{
    s[note].l=l,s[note].r=r;
    if(l==r)return ;
    int mid=l+r>>1;
    build(ls,l,mid),build(rs,mid+1,r);
}
int cover(int note,int l,int r)
{
    if(s[note].c)return 0;
    if(s[note].l==l&&r==s[note].r)
    {
        s[note].c=1;
        return 1;
    }
    int mid=s[note].l+s[note].r>>1,ret;
    if(r<=mid)ret=cover(ls,l,r);
    else if(l>mid)ret=cover(rs,l,r);
    else ret=(cover(ls,l,mid)|cover(rs,mid+1,r));
    pushup(note);
    return ret;
}
int main()
{
    freopen("test.in","r",stdin);
    int i,j,k;
    long long a,b,c;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        cin>>a>>b>>c;
        q[i].x=b,a=(-a-1)*c,c+=a;
        lsh[++cnt]=LSH(i,0,a);
        lsh[++cnt]=LSH(i,1,c);
    }
    sort(lsh+1,lsh+cnt+1);
    for(i=1;i<=cnt;i++)
    {
        if(i==1||lsh[i].x!=lsh[i-1].x)m+=2;
        if(lsh[i].r==0)q[lsh[i].l].l=m;
        else q[lsh[i].l].r=m;
    }
    sort(q+1,q+n+1);
    build(1,1,m);
    int ans=0;
    for(i=1;i<=n;i++)
    {
        ans+=cover(1,q[i].l,q[i].r);
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-11-09 00:44:09

【BZOJ3888】【Usaco2015 Jan】Stampede 线段树判区间覆盖的相关文章

POJ 2528 Mayor&#39;s posters(线段树,区间覆盖,单点查询)

Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45703   Accepted: 13239 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral post

线段树 BZOJ3888 [Usaco2015 Jan]Stampede

3888: [Usaco2015 Jan]Stampede Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 253  Solved: 81[Submit][Status][Discuss] Description Farmer John's N cows (1 <= N <= 50,000) appear to be stampeding along the road at the front of FJ's farm, but they are

poj 1436 Horizontally Visible Segments(线段树、区间覆盖)

Horizontally Visible Segments Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4645   Accepted: 1706 Description There is a number of disjoint vertical line segments in the plane. We say that two segments are horizontally visible if they

BZOJ3888 [Usaco2015 Jan]Stampede

我们只要把每头牛开始遮挡视线和结束遮挡视线的时间点都搞出来就好= = 再按照y轴排序...然后变成线段覆盖了..线段树搞一下就好了? 1 /************************************************************** 2 Problem: 3888 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:1204 ms 7 Memory:22684 kb 8 ****************

2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)

HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道路进行开放.在满足m天内花费最小的情况下,求出每天的花销. 分析: 我们可以想到用线段树想到记录每一段路的开始时间与结束时间,开始时间很简单,就是一开始的时间,结束的时间求法可以参考区间覆盖,这是类似的: 然后我们在转化哪一天开哪些,哪一天关哪些,那这天的贡献sum = 开-关 ; 这很关键,我在比

[BZOJ 3888] [Usaco2015 Jan] Stampede 【线段树】

题目链接:BZOJ - 3888 题目分析 首先,计算出每个线段在 x 坐标 0 处出现的时间开始点和结束点,就转成了时间轴上的线段. 然后就是看每条线段是否被 y 比它小的线段完全覆盖了.注意求出的时间点要离散化,然后应该使用时间轴上的区间来表示,两线段端点重合并不是有共同部分. 将所有线段按照 y 从小到大排序之后,使用线段树判断它覆盖的区间是否已经都被前面的线段覆盖了. 然后将它所覆盖的区间覆盖. 就这样的一道题我WA了7次,还有救吗.. 代码 #include <iostream> #

2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions. The i-th question is whether P remains balanced after pai and pbi  swapped. Note that questions ar

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

HDU 1556 Color the ball(线段树:区间更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和线段树都可以,拿这道题来入门一下线段树的区间更新. 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 1000