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. windows下面安装casperjs

    因为需要 就学习了一下casperjs,CasperJS是一个开源的导航脚本处理和测试工具,基于PhantomJS(前端自动化测试工具)编写.由于casperjs对PhantomJS的依赖性,所以需要 ...

  2. mallo函数

    malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存.原型为extern void *malloc ...

  3. 树(二)——二叉树

    目录 本章主要讲解内容为: 树的非递归遍历算法,两种版本 树的扩展前缀以及前缀中缀构建方法 源码 btree.cpp btree.h 基础知识 一.定义 二叉树的递归定义:二叉树是每个结点最多含有两棵 ...

  4. Windows Store App 变形特效

    在应用程序的开发过程中,为了让界面按照期望的效果显示,有时会对界面元素应用变形特效,例如图片的缩放.旋转.移动等.与3D特效不同,在界面元素实现变形特效之后,其平行关系不会发生改变,只不过是位置.大小 ...

  5. WCF初探-1:认识WCF

    1.WCF是什么? WindowsCommunication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,由.NET Framework 3. ...

  6. 烟草公司基于BPM的IT一体化变革

    广州烟草有限公司隶属于广东省烟草专卖局,中国烟草总公司统一领导.垂直管理.主要职能是负责广州市的烟草生产.经营企业和市场的专卖管理.成立20多年来,广州烟草致力于烟叶和卷烟的生产经营.多元化经营.技术 ...

  7. Day6 google Geocoding API

    在看机器学习实战中K-means一章,练习中需要调用Yahoo PlaceFinder API 为地点添加经纬度,语言是python.申请到了appid但调用好像还要收费,要填写银行卡号才能用,没管那 ...

  8. windows定时执行百度新闻爬虫

    想要做个新闻文本识别分类的项目,就先写了个爬取百度新闻的爬虫. 环境:win7 32 bit python3.4 若干第三方库 可以实现的功能:定期按照百度新闻的分类抓取新闻的标题,所属类别及文本内容 ...

  9. DedeCMS的分页标签pagelist支持中英文的修改方法[转]

    不得不感叹DedeCMS的强大,可定制性和扩展性太强了,就算不懂php也可以很轻松的修改源码. 今天碰到个新问题,用DedeCMS搞了个中英双语的网站,其他的都修改好了,上线之前发现分页条中英文版中都 ...

  10. Visual Studio 2012+jQuery-1.7.1

    今天用Visual Studio 2012开发一个网站项目,在集成jqplot图表控件并进行调试的时候(使用的是MVC4框架),加载网页绘制图表的时候总是报错(提示$.jqplot.barRender ...