Description

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

Input

输入第一行包含一个整数n,即初始黑点个数。以下n行每行包含两个整数(x,y),即一个黑点的坐标。没有两个黑点的坐标相同,坐标的绝对值均不超过109。

Output

输出仅一行,包含黑点的最终数目。如果变色过程永不终止,输出-1。

Sample Input

4
0 2
2 0
-2 0
0 -2

Sample Output

5

数据范围
36%的数据满足:n < = 500
64%的数据满足:n < = 30000
100%的数据满足:n < = 100000

首先不存在无解,且加的能加黑点就是原图的内部白点
枚举每一条竖线(x相同)
显然竖线分成几段
如果一段中存在左右都有点的y,那么答案+1
用树状数组维护这个区间内满足条件的点数
令$l_i$为纵坐标为i,左边有多少点,$r_i$类似
如果$l[y]=0$那么y之后就可以构成一个答案+1
如果$r[y]=1$那么y之后就不再构成答案-1
然后区间求和[a[i-1].y+1,a[i].y-1](黑点不能变成黑点)
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
struct ZYYS
{
int x,y;
}a[];
int t[],num,l[],r[],n;
lol c[],ans;
bool cmp(ZYYS a,ZYYS b)
{
if (a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void update(int x,lol y)
{
while (x<=num)
{
c[x]+=y;
x+=(x&(-x));
}
}
lol query(int x)
{
lol s=;
while (x)
{
s+=c[x];
x-=(x&(-x));
}
return s;
}
int main()
{int i,ed,j;
cin>>n;
for (i=;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
t[++num]=a[i].x;t[++num]=a[i].y;
}
sort(t+,t+num+);
num=unique(t+,t+num+)-t-;
for (i=;i<=n;i++)
{
a[i].x=lower_bound(t+,t+num+,a[i].x)-t;
a[i].y=lower_bound(t+,t+num+,a[i].y)-t;
}
sort(a+,a+n+,cmp);
for (i=;i<=n;i++)
r[a[i].y]++;
ans=n;
for (i=;i<=n;i=ed)
{
ed=i;
while (ed<=n&&a[ed].x==a[i].x) ed++;
for (j=i;j<ed;j++)
{
int y=a[j].y;
if (l[y]==)
update(y,);
if (r[y]==)
update(y,-);
l[y]++;r[y]--;
if (j>i&&j<ed)
ans+=query(y-)-query(a[j-].y);
}
}
cout<<ans<<endl;
}

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
struct ZYYS
{
  int x,y;
}a[800001];
int t[800001],num,l[800001],r[800001],n;
lol c[800001],ans;
bool cmp(ZYYS a,ZYYS b)
{
  if (a.x==b.x) return a.y<b.y;
  return a.x<b.x;
}
void update(int x,lol y)
{
  while (x<=num)
    {
      c[x]+=y;
      x+=(x&(-x));
    }
}
lol query(int x)
{
  lol s=0;
  while (x)
    {
      s+=c[x];
      x-=(x&(-x));
    }
  return s;
}
int main()
{int i,ed,j;
  freopen("1818.in","r",stdin);
  freopen("1818.out","w",stdout);
  cin>>n;
  for (i=1;i<=n;i++)
    {
      scanf("%d%d",&a[i].x,&a[i].y);
      t[++num]=a[i].x;t[++num]=a[i].y;
    }
  sort(t+1,t+num+1);
  num=unique(t+1,t+num+1)-t-1;
  for (i=1;i<=n;i++)
    {
      a[i].x=lower_bound(t+1,t+num+1,a[i].x)-t;
      a[i].y=lower_bound(t+1,t+num+1,a[i].y)-t;
    }
  sort(a+1,a+n+1,cmp);
  for (i=1;i<=n;i++)
    r[a[i].y]++;
  ans=n;
  for (i=1;i<=n;i=ed)
    {
      ed=i;
      while (ed<=n&&a[ed].x==a[i].x) ed++;
      for (j=i;j<ed;j++)
    {
      int y=a[j].y;
      if (l[y]==0)
        update(y,1);
      if (r[y]==1)
        update(y,-1);
      l[y]++;r[y]--;
      if (j>i&&j<ed)
        ans+=query(y-1)-query(a[j-1].y);
    }
    }
  cout<<ans<<endl;
}

[CQOI2010]内部白点的更多相关文章

  1. Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化

    1818: [Cqoi2010]内部白点 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 704  Solved: 344[Submit][Status] ...

  2. 【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)

    [BZOJ1818][CQOI2010]内部白点(树状数组,扫描线) 题面 BZOJ 题解 不难发现\(-1\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...

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

    [BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...

  4. BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组

    BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟 ...

  5. bzoj 1818 Cqoi2010 内部白点 扫描线

    [Cqoi2010]内部白点 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1126  Solved: 530[Submit][Status][Disc ...

  6. 【BZOJ】1818: [Cqoi2010]内部白点(树状数组+离散+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1818 这一题一开始我就看错了,bzoj的那个绝对值109简直坑人,应该是10^9,我直接写了个暴力. ...

  7. 1818: [Cqoi2010]内部白点

    Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1394 Solved: 625 [Submit][Status][Discuss] Descriptio ...

  8. bzoj1818 [Cqoi2010]内部白点

    Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变黑,直到不存在内部白点为止.你的任务是统计最后网格 ...

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

    这个题的想法很好想,就是进行排序之后直接检查每个点的上下左右是否有黑点就行.但是直接枚举显然不行,那怎么办呢?我们就用树状数组维护扫描线,把每排左右点看成一条线覆盖,然后从下往上扫,遇到下加一,遇到上 ...

随机推荐

  1. 04_Python的数据类型1数值和字符串_Python编程之路

    上一节我们通过一个helloworld程序学习python的一些简单操作,还有输入与输出 这节我们来讲Python的数据类型与变量的操作 Python的交互器 在讲这个之前,我要先讲一下python的 ...

  2. Week02-Java基本语法与类库

    1. 本周学习总结 本周主要学习了包装类,明白了包装类比基本数据类型的优点(见书面作业4.2),了解了自动装箱,自动拆箱的概念和区别(见书面作业4.1),知道了java中的引用类似C语言中的指针,明白 ...

  3. Scrum 冲刺 第一日

    Scrum 冲刺 第一日 站立式会议 燃尽图 Alpha 阶段认领任务 明日任务安排 项目预期任务量 成员贡献值计算规则 今日贡献量 参考资料 站立式会议 返回目录 燃尽图 返回目录 Alpha 阶段 ...

  4. Hibernate之Hibernate的体系结构

    体系结构简图: 这是一张体系结构的简图,其中的hibernate.properties文件的作用相当于配置文件hibernate.cfg.xml XML Mapping对应的就是映射文件 XXXX.h ...

  5. bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色

    http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+ ...

  6. OO第一次阶段性总结

    经过三次作业的历练之后终于来到了写博客这一周.回顾开学来的这一个月,令我印象最深刻也是最累的一门课就是OO了.虽然上学期学过一部分Java,但这学期开学就来的OO作业还是让我在第二周就开始熬夜了.不过 ...

  7. Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇——多页面VueSSR+热更新Server)

    Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇--多页面VueSSR+热更新Server) @(HTML/JS) 这是Vue多页面框架系列文章的第二篇,上一篇(纯前 ...

  8. MHA 安装与简单使用

    MHA 在过去几年一直用的比较火,特别是在在传统复制的那个年代.至从有了GTID好像我们也可以把MHA给忘记了,但是很多企业现在还是在用的比较多.每个公司的MHA玩法也不太一样,但是本质都是差不多了. ...

  9. Java 10 的 10 个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  10. Python 自动化 第一周

    1.Python简介 1.1.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时 ...