P4385 [COCI2009]Dvapravca
首先特判掉蓝点数量\(<2\)的情况。没有蓝点答案就是\(n\),有一个蓝点可以枚举一个红点,选择过这个蓝点和红点的一条线和在无穷远处的平行线(即这条线对应的两个半平面)。
这里认为过一个点是与这个点无限接近,红点的话认为红点在平行线中,蓝点不在平行线中
构造方案的时候想象两个阶段:
- 如果有一条线不过蓝点,可以继续向外扩张直到过蓝点为止,现在两条平行线固定过两个蓝点
- 如果没有平行线过红点,可以旋转这两条平行线知道一个平行线过红点为止。这个过程不会损失红点,而且可能加入新的红点。
所以结论是:两条平行线肯定分别过两个蓝点,而且还有一条平行线过一个红点。
先枚举一个蓝点和一个红点,一条线过这两个点;然后找到在两个方向距离这条线最近的蓝点,直接算红点数量即可。
复杂度\(O(n^3)\)。
直接做肯定过不去,所以先把整张图随机旋转,然后按照x坐标排序。
时间的正确性请咨询@Leo______ 。
#include<bits/stdc++.h>
#define il inline
#define vd void
il int gi(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f^=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
struct point{double x,y;}r[1010],b[1010];
il bool operator<(const point&a,const point&b){return a.x<b.x;}
char col;
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
int n=gi(),R=0,B=0;
srand(time(NULL));
double v=rand()%1000*0.1+0.1;
for(int i=1;i<=n;++i){
int _x=gi(),_y=gi();
do col=getchar();while(col!='R'&&col!='B');
if(col=='R')r[++R]=(point){sin(v)*_x-cos(v)*_y,sin(v)*_y-cos(v)*_x};
else b[++B]=(point){sin(v)*_x-cos(v)*_y,sin(v)*_y-cos(v)*_x};
}
std::sort(r+1,r+R+1);
std::sort(b+1,b+B+1);
if(!B)return printf("%d\n",n),0;
int ans=0;
double kk,bb,dist,dist_up,dist_dn;
int upans,dnans;
for(int i=1;i<=B;++i)
for(int j=1;j<=R;++j){
kk=1.0*(b[i].y-r[j].y)/(b[i].x-r[j].x),bb=b[i].y-kk*b[i].x;
dist_up=1e18,dist_dn=1e18;
for(int k=1;k<=B;++k)
if(k!=i){
dist=kk*b[k].x+bb-b[k].y;
if(dist<0){
if(-dist<dist_up)dist_up=-dist;
}else{
if(dist<dist_dn)dist_dn=dist;
}
}
upans=1,dnans=1;
for(int k=1;k<=R;++k)
if(k!=j){
dist=kk*r[k].x+bb-r[k].y;
if(dist<0){
if(-dist<=dist_up+1e-7)++upans;
}else{
if(dist<=dist_dn+1e-7)++dnans;
}
}
ans=std::max(ans,std::max(upans,dnans));
}
printf("%d\n",ans);
return 0;
}
P4385 [COCI2009]Dvapravca的更多相关文章
- luogu P4385 [COCI2009]Dvapravca
传送门 我真的弱,正解都不会还打了个错的暴力 考虑平行线与x轴平行,那么可以按照y为第一关键字升序,x为第二关键字升序排序,然后合法的一段红点就是连续的一段,答案也就是最大的连续红色段 推广到一般情况 ...
- [洛谷P4385][COCI2009]Dvapravca(咕咕咕)
题目大意:很早以前做的题 题解: 卡点: C++ Code: #pragma GCC optimize("Ofast") #pragma GCC optimize("un ...
- [COCI2009]Dvapravca 计算几何
[COCI2009]Dvapravca LG传送门 先给出考场上的\(O(n^3)\)乱搞方法:枚举一个蓝点和一个红点,找出过着两个点的直线,再枚举蓝点找出这条直线最多能往两边扩展多宽,最后枚举红点计 ...
- bzoj3086: Coci2009 dvapravca
Description 给定平面上的 N 个点, 其中有一些是红的, 其他是蓝的.现在让你找两条平行的直线, 使得在保证 不存在一个蓝色的点 被夹在两条平行线之间,不经过任何一个点, 不管是蓝色 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 3090: Coci2009 [podjela]
3090: Coci2009 [podjela] Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 23 Solved: 17[Submit][Statu ...
- BZOJ 3090: Coci2009 [podjela] (树形背包)
3090: Coci2009 [podjela] Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 45 Solved: 31[Submit][Statu ...
- bzoj3087: Coci2009 misolovke
Description [misolovke]给定一个 N*N 的网格.每个格子里至少会有一个捕鼠器, 并且已知每个格子里的捕鼠器个数.现在需要在 每一行 中选取恰好 K 个连续的格子, 把里面的捕鼠 ...
- BZOJ2223:[Coci2009]PATULJCI——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2223 Description Sample Input 10 3 1 2 1 2 1 2 3 2 3 ...
随机推荐
- 使用ES6+Vue+webpack+gulp构建新一代Web应用
1.推荐学习网站:Vue.js中国 2.Demo环境搭建: 2.1环境配置 安装nodejs环境,具体内容可以百度: 新建一个文件夹: mkdir VUE-ES6-WebPack 全局安装gulp: ...
- HDFS namenode 写edit log原理以及源码分析
这篇分析一下namenode 写edit log的过程. 关于namenode日志,集群做了如下配置 <property> <name>dfs.nameservices< ...
- 10分钟让你明白MySQL是如何利用索引的
一.前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? MySQL ...
- JDOM 操作XML
http://www.cnblogs.com/hoojo/archive/2011/08/11/2134638.html 可扩展标记语言——eXtensible Markup Language 用户可 ...
- priority_queue的优先级变化(结构体的写法)
priority_queue的优先级变化(结构体的写法) 在头文件中加上#include <queue> 即可使用stl中的库函数priority_queue,优先队列默认的是从大到小的优 ...
- myeclipse10配置maven
一:Maven的下载安装 准备工作: 1)安装环境 Windows xp 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.e ...
- MySQL keepalived 双主.md
MySQL keepalived 双主搭建 环境说明 系统 IP 主机名 mysql keepalived VIP CentOS 6.8 192.168.197.61 C6-node1 5.6.36 ...
- AES块加密与解密
AES块加密与解密 解密目标 在CBC和CTR两种模式下分别给出十篇加密的样例密文,求解密一篇特定的密文 解密前提 全部密文及其加密使用的key都已给出 加密的方法遵循AES的标准 解密过程分析 实验 ...
- 信号处理开源库SP++介绍
SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源 C++程序库,该库提供了信号处理与数值计算中常用算法的 C++实现.SP++中所有算法都以 C++类 ...
- redis主从搭建
两台服务器 127.0.0.101 A 主服务器 127.0.0.108 B 从服务器 从服务器设置 1.修改redis.conf 依次修改daemonize no改为daemonize yes 默 ...