luogu 3415 祭坛
题目大意:
在平面上,有 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 祭坛的更多相关文章
- luoguP3415 祭坛
https://www.luogu.org/problemnew/show/P3415 考虑二分结界层数,将 n 个点按 x 大小依次加入答案,一行一行的做,用树状数组维护当前这一行中[0, x - ...
- Luogu P5603 小C与桌游【贪心+拓扑排序】
[Description]https://www.luogu.com.cn/problem/P5603 \(\;\) 题意可以简化为:一个不保证联通,n个点,m条边的DAG(有向无环图),构造一个拓扑 ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- HDU 4870 Rating(概率、期望、推公式) && ZOJ 3415 Zhou Yu
其实zoj 3415不是应该叫Yu Zhou吗...碰到ZOJ 3415之后用了第二个参考网址的方法去求通项,然后这次碰到4870不会搞.参考了chanme的,然后重新把周瑜跟排名都反复推导(不是推倒 ...
- POJ 3415 后缀数组
题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...
- BZOJ2934 : [Poi1999]祭坛问题
对于每个祭坛,算出每条线段阻碍它的角度区间,然后排序求并看看是否有空位即可,时间复杂度$O(n^2\log n)$. 这题在Main上官方时限是0.2S,因此需要几个常数优化: $1.$为了避免用at ...
- LA 3415 (二分图+最大独立集)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
随机推荐
- 梦想CAD控件系统变量说明
这里介绍一些常用系统变量有String.double.long.McGePoint3d等类型,其中有部分系统变量是随图纸保存,再次打开时就会读取图纸中的系统变量,有些系统变量不随图纸保存,其作用来控制 ...
- RabbitMQ系列(三)--Java API
基于java使用RabbitMQ 框架:SpringBoot1.5.14.RELEASE maven依赖: <dependency> <groupId>com.rabbitmq ...
- scp 上传文件自动录入密码
--- 服务器IP地址 des_host=serverIp 服务器存储路径(文件上传后存储指定目录下) des_direc=/home/lk/ 服务器用户密码 des_pass=root_passwo ...
- POJ P2096 Collecting Bugs
思路 分类讨论,不妨先设$DP[i][j]$表示已经发现$i$种子系统中有$n$种$bug$无非只有四种情况 发现的$bug$在旧的系统旧的分类,概率$p1$是$(i/s)*(j/n)$. 发现的$b ...
- zabbix部署-版本3.2.6
172.18.237.14:一台主机上安装LAMP环境以及zabbix_server.zabbix_agentd 一.安装zibbix-server 1.环境要求 yum install mysql- ...
- VS C#报错CS1056意外的字符"(Unexpected Character")
今天重装了下VS2017,再打开之前的项目发现运行不了了,报错如图 解决方法: 找到.NETFramework,Version=v4.5.2.AssemblyAttributes.cs这个文件删除就好 ...
- 作为一个程序员,分享一下我自己常用的几款非常方便的chrome插件
作为一名资深码农,结合身边一群IT民工的真实体验,小编有那么一点权威给各位推荐几款程序员必备.常用的chrome扩展插件. 1.Click&Clean Click&Clean插件可以监 ...
- Django-django-redis使用
自定义连接池 这种方式跟普通py文件操作redis一样,代码如下: views.py import redis from django.shortcuts import render,HttpResp ...
- MySQL Connector/Python 接口 (一)
这里仅介绍 MySQL 官方开发的 Python 接口,参见这里: https://dev.mysql.com/doc/connector-python/en/ Chapter 1 Introduct ...
- [luoguP3252] [JLOI2012]树(DP)
传送门 树上前缀和. 在树上找一条权值和为 s 的链,其中这个链上的点按深度递增(递减)(不同) dfs 每搜到一个点求它的前缀和 sum[x],放入 set 中. 在 set 中找 sum[x] - ...