题目大意:

在平面上,有 n 个水晶柱,每个水晶柱可以用一个点表示

如果 4 个水晶柱依次相连可以构成一个四边形,满足其两条对角线分别平行于 x 轴和 y 轴,并且对角线的交点位于四边形内部(不包括边界)

那么这 4 个水晶柱就可以建立一个结界

其中,对角线的交点称作这个结界的中心

例如下左图中,水晶柱 ABCD 可以建立一个结界,其中心为 O

人们会把祭坛修建在最多层结界的保护中

其中不同层的结界必须有共同的中心,这些结界的边界不能有任何公共点,并且中心处也不能有水晶柱

这里共同中心的结界数量叫做结界的层数

为了达成这个目的,人们要先利用现有的水晶柱建立若干个结界,然后在某些结界的中心建立祭坛

例如上右图中,黑色的点表示水晶柱(注意 P 和 O 点不是水晶柱)。祭坛的一个最佳位置为 O 点,可以建立在 3 层结界中,其结界的具体方案见下左

当然,建立祭坛的最佳位置不一定是唯一,在上右图中,O 点左侧 1 单位的点 P 也可以建立一个在 3 层结界中的祭坛,见下右图

 

现在人们想知道:祭坛最佳选址地点所在的结界层数以及祭坛最佳的选址地点共有多少个

思路:

首先可以二分一下答案

然后对于每一个满足条件的点在它的上下左右四个方向一定有至少mid个点

对于上下或者左右是否满足条件 可以直接求出这个区间

对于另一个方向 使用扫描线与树状数组维护

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 2139062143
#define ll long long
#define MAXN 100100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,up[MAXN],dn[MAXN],q[MAXN],cnt;
vector<int> vec[MAXN];
int c[MAXN],hsh[MAXN];
int lowbit(int x) {return x&(-x);}
void add(int x,int val) {for(int i=x;i<=n;i+=lowbit(i)) c[i]+=val;}
int query(int x) {int res=;for(int i=x;i;i-=lowbit(i)) res+=c[i];return res;}
int check(int x)
{
int res=,t;
memset(hsh,,sizeof(hsh));
memset(c,,sizeof(c));
memset(up,,sizeof(up));
memset(dn,,sizeof(dn));
for(int i=;i<=cnt;i++)
for(int j=;j<vec[q[i]].size();j++) dn[vec[q[i]][j]]++;
for(int k=;k<=cnt;k++)
{
t=q[k];
for(int i=;i<vec[t].size();i--)
{
dn[vec[t][i]]--;
if((dn[vec[t][i]]<x||up[vec[t][i]]<x)&&hsh[vec[t][i]])
hsh[vec[t][i]]=,add(vec[t][i],-);
}
if(x-<vec[t].size())
{
int l=vec[t][x-],r=vec[t].size()-x;
if(r<) goto ed;
r=vec[t][r];
if(r>&&l<=r-) res+=query(r-)-query(l);
}ed:;
for(int i=;i<vec[t].size();i--)
{
up[vec[t][i]]++;
if(dn[vec[t][i]]>=x&&up[vec[t][i]]>=x&&!hsh[vec[t][i]]) {hsh[vec[t][i]]=,add(vec[t][i],);}
}
}
return res;
}
int main()
{
n=read();int a,b;
for(int i=;i<=n;i++)
{
a=read(),b=read();
vec[a].push_back(b);
q[++cnt]=a;
}
sort(q+,q+cnt+);
cnt=unique(q+,q+cnt+)-q-;
for(int i=;i<=cnt;i++) sort(vec[q[i]].begin(),vec[q[i]].end());
int l=,r=n,ans=,res=;
while(l<=r)
{
int mid=l+r>>;
if(a=check(mid)) ans=mid,l=mid+,res=a;
else r=mid-;
}
printf("%d\n%d",ans,res);
}

luogu 3415 祭坛的更多相关文章

  1. luoguP3415 祭坛

    https://www.luogu.org/problemnew/show/P3415 考虑二分结界层数,将 n 个点按 x 大小依次加入答案,一行一行的做,用树状数组维护当前这一行中[0, x - ...

  2. Luogu P5603 小C与桌游【贪心+拓扑排序】

    [Description]https://www.luogu.com.cn/problem/P5603 \(\;\) 题意可以简化为:一个不保证联通,n个点,m条边的DAG(有向无环图),构造一个拓扑 ...

  3. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  4. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  5. HDU 4870 Rating(概率、期望、推公式) && ZOJ 3415 Zhou Yu

    其实zoj 3415不是应该叫Yu Zhou吗...碰到ZOJ 3415之后用了第二个参考网址的方法去求通项,然后这次碰到4870不会搞.参考了chanme的,然后重新把周瑜跟排名都反复推导(不是推倒 ...

  6. POJ 3415 后缀数组

    题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...

  7. BZOJ2934 : [Poi1999]祭坛问题

    对于每个祭坛,算出每条线段阻碍它的角度区间,然后排序求并看看是否有空位即可,时间复杂度$O(n^2\log n)$. 这题在Main上官方时限是0.2S,因此需要几个常数优化: $1.$为了避免用at ...

  8. LA 3415 (二分图+最大独立集)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  9. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

随机推荐

  1. iptables详解(1):iptables概念

    所属分类:IPtables  Linux基础  基础知识  常用命令 这篇文章会尽量以通俗易懂的方式描述iptables的相关概念,请耐心的读完它. 防火墙相关概念 此处先描述一些相关概念. 从逻辑上 ...

  2. 散列--P1047 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,-,L,都种有 ...

  3. [Python数据结构] 使用List实现Stack

    [Python数据结构] 使用List实现Stack 1. Stack 堆栈(Stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型(ADT),其特殊之处在于只能允许在阵列的一端进 ...

  4. redis学习——数据类型

    一.内容简介 Redis不仅仅是简单的key-value 存储器,同时也是一种data structures server.传统的key-value是指支持使用一个key字符串来索引value字符串的 ...

  5. Shiro_权限 URL 配置细节

    [部分细节] 1.[urls] 部分的配置,其格式是:“url=拦截器[参数],拦截器[参数]”: 2.如果当前请求的URL匹配 [urls] 部分的某个url模式,将会执行其配置的拦截器. 3.an ...

  6. MSSQL获取指定日期的SQL语句

    --1.一个月第一天的 SELECT DATEADD(mm,DATEDIFF(mm,0,getdate()),0) --2.本周的星期一 SELECT DATEADD(wk,DATEDIFF(wk,0 ...

  7. Android三角标签View:TriangleLabelView

     Android三角标签View:TriangleLabelView 在一些商城.产品推销类APP中,如淘宝.京东.电影门票销售.商品降价促销这类的APP,常常会在其APP中看到,某些商品的左上角 ...

  8. HDU 4923 (贪心+证明)

    Room and Moor Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is ...

  9. hdu 2089 记忆化搜索写法(数位dp)

    /* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...

  10. 如何用Bugzilla系统管理产品研发过中相关需求和bug

    目 录 1.Bug处理流程及状态说明 2.bugs字段说明 3.查询报表的使用 4.bug系统与需求系统的整合 5.流程和用户权限 1. Bug处理流程及状态说明(1) BUG状态流程图 BUG的状态 ...