Description

给定平面上的 N 个点, 其中有一些是红的, 其他是蓝的.现在让你找两条平行的直线, 使得在保证
    不存在一个蓝色的点 被夹在两条平行线之间,不经过任何一个点, 不管是蓝色点还是红色点
的前提下, 被夹在平行线之间的红色点个数最多

Input

第1行: 一个整数 N (1 <= N <= 1000)
    第2..N+1行: 每行是一个点的坐标以及它的颜色.
                坐标用2个 绝对值<10^9 的整数表示
                颜色用 'R' 或 'B' 表示

Output

第1行: 仅一个整数, 被夹在平行线之间的红色点个数的最大值

令一条直线l垂直于所选平行直线,将点投影到直线上,考虑点的投影之间相对位置构成的序列,则问题转化为求序列的最长红色子串

直线旋转180度,则枚举了所有可能的倾斜角,而任意两点投影的相对位置只会发生一次变化,序列变化了O(n^2)次,因此可以用线段树维护这个序列同时维护最长红色子串

只能在序列上的投影点不发生重合时更新答案

#include<cstdio>
#include<algorithm>
typedef long long i64;
int n,ep=,ans=;
struct pos{
int x,y;
};
pos operator-(pos a,pos b){
return (pos){a.x-b.x,a.y-b.y};
}
i64 operator*(pos a,pos b){
return i64(a.x)*b.y-i64(a.y)*b.x;
}
struct point{
pos a;
int col;
bool operator<(const point&w)const{return a.y!=w.a.y?a.y<w.a.y:a.x<w.a.x;}
}ps[];
struct ev{
pos x;
int a,b;
bool operator<(const ev&w)const{return x*w.x<;}
}es[*];
char str[];
int ls[],rs[],ms[],ws[],sz[];
int max(int a,int b){return a>b?a:b;}
inline void up(int w,int l,int r){
ms[w]=max(ms[l],max(ms[r],rs[l]+ls[r]));
ls[w]=ls[l];
if(ls[l]==sz[l])ls[w]+=ls[r];
rs[w]=rs[r];
if(rs[r]==sz[r])rs[w]+=rs[l];
}
void set(int w,int v){
for(w+=,ls[w]=rs[w]=ms[w]=v,w>>=;w;w>>=)up(w,w<<,w<<^);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%d%d%s",&ps[i].a.x,&ps[i].a.y,str);
ps[i].col=str[]=='R';
}
std::sort(ps+,ps+n+);
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
pos w=ps[j].a-ps[i].a;
if(w.y>||w.y==&&w.x>)es[ep++]=(ev){w,i,j};
}
}
for(int i=;i<=n;++i){
ws[i]=i;
sz[i+]=;
if(ps[i].col)ls[i+]=rs[i+]=ms[i+]=;
}
for(int i=;i;--i)sz[i]=sz[i<<]+sz[i<<^],up(i,i<<,i<<^);
ans=ms[];
std::sort(es,es+ep);
for(int i=,j=;i<ep;){
for(;j<ep&&es[i].x*es[j].x==;++j);
for(;i<j;++i){
int a=es[i].a,b=es[i].b;
std::swap(ws[a],ws[b]);
if(ps[a].col!=ps[b].col){
set(ws[a],ps[a].col);
set(ws[b],ps[b].col);
}
}
ans=max(ans,ms[]);
}
printf("%d",ans);
return ;
}

bzoj3086: Coci2009 dvapravca的更多相关文章

  1. [COCI2009]Dvapravca 计算几何

    [COCI2009]Dvapravca LG传送门 先给出考场上的\(O(n^3)\)乱搞方法:枚举一个蓝点和一个红点,找出过着两个点的直线,再枚举蓝点找出这条直线最多能往两边扩展多宽,最后枚举红点计 ...

  2. luogu P4385 [COCI2009]Dvapravca

    传送门 我真的弱,正解都不会还打了个错的暴力 考虑平行线与x轴平行,那么可以按照y为第一关键字升序,x为第二关键字升序排序,然后合法的一段红点就是连续的一段,答案也就是最大的连续红色段 推广到一般情况 ...

  3. P4385 [COCI2009]Dvapravca

    首先特判掉蓝点数量\(<2\)的情况.没有蓝点答案就是\(n\),有一个蓝点可以枚举一个红点,选择过这个蓝点和红点的一条线和在无穷远处的平行线(即这条线对应的两个半平面). 这里认为过一个点是与 ...

  4. [洛谷P4385][COCI2009]Dvapravca(咕咕咕)

    题目大意:很早以前做的题 题解: 卡点: C++ Code: #pragma GCC optimize("Ofast") #pragma GCC optimize("un ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. BZOJ 3090: Coci2009 [podjela]

    3090: Coci2009 [podjela] Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 23  Solved: 17[Submit][Statu ...

  7. BZOJ 3090: Coci2009 [podjela] (树形背包)

    3090: Coci2009 [podjela] Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 45  Solved: 31[Submit][Statu ...

  8. bzoj3087: Coci2009 misolovke

    Description [misolovke]给定一个 N*N 的网格.每个格子里至少会有一个捕鼠器, 并且已知每个格子里的捕鼠器个数.现在需要在 每一行 中选取恰好 K 个连续的格子, 把里面的捕鼠 ...

  9. 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 ...

随机推荐

  1. spring随手笔记4:ref的属性

    1.local属性 引用在同一个xml的bean           只能引用bean的id <bean id="HelloWord" class="com.ltf ...

  2. Input 值改变触发事件

    $('#keyword').bind('input propertychange', function() { $('.close-search').show();});  

  3. redis入门指南-安装redis

    纸上得来终觉浅 绝知此事要躬行 Redis官方不支持window.微软发布了可在redis的分支.不建议使用 但我确实用了. win7 redis2.8.4  php5.6  apache2.4 ht ...

  4. apache启动时80端口占用的解决方法

    问题: (98)Address already in use: make_sock: could not bind to address [::]:80 (98)Address already in ...

  5. C语言基础--数组及相关

    概念: 一堆相同类型的数据的有序集合 格式: 元素类型  数组名称[ 元素个数 ] 定义数组: // 定义了一个名称叫做scores的数组, 数组中可以存放3个int类型的数据 ]; // 只要定义一 ...

  6. PowerShell脚本:随机密码生成器

    脚本名称:s随机密码生成器_v2.63.ps1脚本作用:产生随机密码.每密码字符个数,密码数量,存盘位置等可以自定义.脚本用法:脚本采用了硬编码,所以你需要打开脚本,修改如下变量:$生成密码总个数 = ...

  7. [转]Android,Yocto,Meego构建系统的区别

    http://m.blog.csdn.net/blog/sonach_tjsd/6647829

  8. Day3 summary

    今天主要学习了K-means算法,又过了遍Andrew教授的coursera视频,弄明白了Action书上的算法.困难出现在实例练习,申请Yahoo place finder API获得了appid, ...

  9. 隐匿在iOS文件系统中的隐私信息

    说明: . 本文仅供安全学习及教学用途,提及的部分技术带有攻击性,请确保合法使用. . “这些都不是我干的,我就负责说出来.” . 图片仅供参考. . 本文所讨论的内容适用于iOS .4环境,其应用程 ...

  10. Binary Tree Inorder Traversal -- LeetCode 94

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...