题目大意:

在平面上,有 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. CAD使用GetxDataLong读数据(网页版)

    主要用到函数说明: MxDrawEntity::GetxDataLong2 读取一个Long扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...

  2. CAD得到0层上的所有实体(com接口VB语言)

    主要用到函数说明: IMxDrawSelectionSet::Select 构造选择集.详细说明如下: 参数 说明 [in] MCAD_McSelect Mode 构造选择集方式 [in] VARIA ...

  3. luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线

    Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...

  4. react antD moment

    import moment from 'moment' console.log(moment().add(1, 'days').format('YYYY-MM-DD')) //当前时间前一天 cons ...

  5. cgroup代码浅析(1)

    前置:这里使用的linux版本是4.8,x86体系. cgroup_init_early(); 聊这个函数就需要先了解cgroup. cgroup概念 这个函数就是初始化cgroup所需要的参数的.c ...

  6. Opencv下双线性插值法进行图像放缩

    关于图像放缩的算法有很多,本文主要介绍双线性插值法进行图像放缩,本文参考了: http://www.cnblogs.com/funny-world/p/3162003.html 我们设源图像src的大 ...

  7. Re0:DP学习之路 母牛的故事 HDU - 2018

    解法 一定要注意斐波那契数列的原始意义,斐波那契数列也叫作兔子数列是兔子繁衍的一种表示方法.同样适用于别的情况的动物繁衍问题 原始的是3个月一胎现在四个月那么方程就是 f(n)=n n<=4 f ...

  8. centos7进入救援模式,修复错误配置

    因某些修改操作,导致系统重启后无法正常启动,此时可进入救援模式,修复错误配置即可. OS:centos 7 1.重启系统后,进入grup引导页面,选中第一项然后按“e” 进入编辑模式: 2.通过↓键找 ...

  9. loadrunner12 + ie11 无internet, 代码中文乱码

    第一次用lr    录制的时候显示无internet, 在网上找了好久答案, 无非是ie路径设置,还有证书......   都试过了不好用,自己研究一下午 , 最后发现是协议没对应上,http协议  ...

  10. 【11】AngularJS HTML DOM

    AngularJS HTML DOM AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令. ng-disabled 指令 ng-disabled 指令直接绑定应用程序数据到 ...