BZOJ 1818 内部白点

扫描线。

cmp不要乱打。。。。。最后一个一定不要if直接return。

感谢http://hzwer.com/1836.html

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100500
using namespace std;
int n,hash[maxn],top=0,t[maxn],cnt=0;
struct pnt
{
    int x,y;
}p[maxn];
struct query
{
    int y,l,r,x,type;
}q[maxn*10];
bool cmp1(pnt x,pnt y)
{
    if (x.y!=y.y) return x.y<y.y;
    return x.x<y.x;
}
bool cmp2(pnt x,pnt y)
{
    if (x.x!=y.x) return x.x<y.x;
    return x.y<y.y;
}
bool cmp3(query x,query y)
{
    if (x.y!=y.y) return x.y<y.y;
    return x.type<y.type;
}
int find(int x)
{
    return lower_bound(hash+1,hash+top+1,x)-hash;
}
void addq(int x,int y,int type)
{
    if (type==0)
    {
        cnt++;
        q[cnt].y=p[x].y;q[cnt].type=type;q[cnt].x=0;
        q[cnt].l=find(p[x].x);q[cnt].r=find(p[y].x);
    }
    else
    {
        cnt++;
        q[cnt].y=p[x].y;q[cnt].type=type;
        q[cnt].x=find(p[x].x);q[cnt].l=q[cnt].r=0;
    }
}
void build_line()
{
    sort(p+1,p+n+1,cmp1);
    for (int i=2;i<=n;i++)
    {
        if (p[i-1].y==p[i].y)
            addq(i-1,i,0);
    }
    sort(p+1,p+n+1,cmp2);
    for (int i=2;i<=n;i++)
    {
        if (p[i-1].x==p[i].x)
        {
            addq(i-1,0,1);
            addq(i,0,-1);
        }
    }
    sort(q+1,q+cnt+1,cmp3);
}
int lowbit(int x)
{
    return (x&(-x));
}
void modify(int x,int val)
{
    for (int i=x;i<=top;i+=lowbit(i))
        t[i]+=val;
}
int ask(int x)
{
    int ret=0;
    for (int i=x;i>=1;i-=lowbit(i))
        ret+=t[i];
    return ret;
}
void get_ans()
{
    int ans=0;
    for (int i=1;i<=cnt;i++)
    {
        if (q[i].type==-1) modify(q[i].x,-1);
        else if (q[i].type==1) modify(q[i].x,1);
        else ans+=ask(q[i].r-1)-ask(q[i].l);
    }
    printf("%d\n",ans+n);
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&p[i].x,&p[i].y);
        hash[++top]=p[i].x;
    }
    sort(hash+1,hash+top+1);top=unique(hash+1,hash+top+1)-hash-1;
    build_line();
    get_ans();
    return 0;
}
时间: 2024-10-06 08:00:44

BZOJ 1818 内部白点的相关文章

BZOJ 1818 内部白点(离散化+树状数组)

此题就是1227 的弱化版. 画个图或者稍微证明一下就能够知道,一定不会超过一次变换. 那么我们只需要统计有多少个白点会变黑,换句话说就是有多少个白点上下左右都有黑点. 离散化横坐标,因为没有黑点在的列是没有任何意义的,对答案也没有贡献. 然后处理每一行,对于每一行,维护一个BIT也就是哪些点会产生贡献,这个BIT最多只会有n次修改,n次查询. 所以时间复杂度为O(nlogn). # include <cstdio> # include <cstring> # include &l

1818: [Cqoi2010]内部白点

1818: [Cqoi2010]内部白点 15:08:51 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变黑,直到不存在内部白点为止.你的任务是统计最后网格中的黑点个数. 内部白点的定义:一个白色的整点P(x,y)是内部白点当且仅当P在水平线的左边和右边各至少有一个黑点(即存在x1 < x < x2使得(x1,y)和(x2,y)都是黑点),且在竖直线的上边和下边各至少有一个黑点(即存在y1

BZOJ1818: [Cqoi2010]内部白点

1818: [Cqoi2010]内部白点 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1004  Solved: 485[Submit][Status][Discuss] Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变黑,直到不存在内部白点为止.你的任务是统计最后网格中的黑点个数. 内部白点的定义:一个白色的整点P(x,y)是内部白点当且仅当P

【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组

[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变黑,直到不存在内部白点为止.你的任务是统计最后网格中的黑点个数. 内部白点的定义:一个白色的整点P(x,y)是内部白点当且仅当P在水平线的左边和右边各至少有一个黑点(即存在x1 < x < x2使得(x1,y)和(x2,y)都是黑点),且在竖直线的上边和下边各至少有一个黑点(即存在y1 <

B1818 [Cqoi2010]内部白点 树状数组

这个题的想法很好想,就是进行排序之后直接检查每个点的上下左右是否有黑点就行.但是直接枚举显然不行,那怎么办呢?我们就用树状数组维护扫描线,把每排左右点看成一条线覆盖,然后从下往上扫,遇到下加一,遇到上减一并记录答案.这样用扫描线维护就行了. 题干: Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变黑,直到不存在内部白点为止.你的任务是统计最后网格中的黑点个数. 内部白点的定义:一个白色的整点P(

bzoj 1818 [CQOI 2010] 内部白点 - 扫描线 - 树状数组

题目传送门 快速的列车 慢速的列车 题目大意 一个无限大的方格图内有$n$个黑点.问有多少个位置上下左右至少有一个黑点或本来是黑点. 扫描线是显然的. 考虑一下横着的线段,取它两个端点,横坐标小的地方放一个+1,大的地方放一个-1事件. 然后扫描,扫到的横着的线段更新,竖着的线段用树状数组求答案. 然后考虑这一列上原来存在的黑点有没有被统计,如果没有就加上. Code 1 /** 2 * bzoj 3 * Problem#1818 4 * Accepted 5 * Time: 1824ms 6

BZOJ 1818: [Cqoi2010]内部白点

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1818 扫描线+树状数组. 首先可以看出题目其实是求有多少点上下左右至少有一个黑点. 拿x轴离散化,对x轴排一次序,于是我们可以拿出每一条竖线,把它拆成两个事件点,一个+1,一个-1,然后再对y轴排一次序,当作一条事件线段,记下左右端点. 然后对于这些事件按y轴排一次序,然后树状数组就可以了. #include<cstring> #include<iostream> #inclu

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

待 题表

题表 达哥终极杂题表Bzoj2839 hdu6021 Codeforces 804DBzoj2248 hdu5575 Codeforces 786CBzoj2013 bzoj2676 Codeforces 803CBzoj2386 bzoj3782 Codeforces 813DBzoj2699 cogs1667 Codeforces 814DBzoj4798 bzoj2064 Codeforces 814EBzoj4639 bzoj3505 Codeforces 815ABzoj4417 bz