传送门

我真的弱,正解都不会还打了个错的暴力

考虑平行线与x轴平行,那么可以按照y为第一关键字升序,x为第二关键字升序排序,然后合法的一段红点就是连续的一段,答案也就是最大的连续红色段

推广到一般情况,我们可以把所有点绕原点旋转,每次转着都会有两个点排序后的相对位置交换,可以用线段树维护答案,每次单点修改,取出全局最大连续段更新答案

#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register using namespace std;
const int N=1000+10;
const db pi=acos(-1),eps=1e-10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct point
{
db x,y;
bool o;
point(){}
point(db nx,db ny,char ch){x=nx,y=ny,o=ch=='R';}
bool operator < (const point &bb) const {return y!=bb.y?y<bb.y:x<bb.x;}
point operator - (const point &bb) const {return point(x-bb.x,y-bb.y,0);}
db operator * (const point &bb) const {return x*bb.y-y*bb.x;}
}a[N];
il db sq(db x){return x*x;}
il db dis(point aa,point bb){return sqrt(sq(aa.x-bb.x)+sq(aa.y-bb.y));}
int n;
bool o[N];
int s[N],t,m;
struct line
{
int x,y;
db k;
bool operator < (const line &bb) const {return k<bb.k;}
}li[N*N];
struct node
{
int sm,s,ls,rs;
node(){sm=s=ls=rs=0;}
node(bool o){sm=o?1:-(1<<20),s=ls=rs=o;}
node operator + (const node &bb) const
{
node an;
an.sm=sm+bb.sm;
an.s=max(max(s,bb.s),rs+bb.ls);
an.ls=max(ls,sm+bb.ls);
an.rs=max(bb.rs,bb.sm+rs);
return an;
}
}tr[N<<2];
int rk[N],p[N];
void bui(int o,int l,int r)
{
if(l==r){tr[o]=node(a[l].o),p[l]=o;return;}
int mid=(l+r)>>1;
bui(o<<1,l,mid),bui(o<<1|1,mid+1,r);
tr[o]=tr[o<<1]+tr[o<<1|1];
}
il void modif(int x,int y)
{
int o=p[x];
tr[o]=node(y),o>>=1;
while(o) tr[o]=tr[o<<1]+tr[o<<1|1],o>>=1;
} int main()
{
n=rd();
char cc[2];
for(int i=1;i<=n;++i)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
scanf("%s",cc);
a[i]=point(a[i].x,a[i].y,cc[0]);
}
sort(a+1,a+n+1);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
li[++m]=(line){i,j,fabs(a[i].x-a[j].x)>eps?(a[i].y-a[j].y)/(a[i].x-a[j].x):1e30};
sort(li+1,li+m+1);
bui(1,1,n);
for(int i=1;i<=n;++i) rk[i]=i;
int ans=tr[1].s;
for(int i=upper_bound(li+1,li+m+1,(line){0,0,-1e-30})-li;i<=m;++i)
{
int x=li[i].x,y=li[i].y;
modif(rk[x],a[y].o),modif(rk[y],a[x].o);
swap(rk[x],rk[y]);
ans=max(ans,tr[1].s);
}
bui(1,1,n);
for(int i=1;i<=n;++i) rk[i]=i;
for(int i=lower_bound(li+1,li+m+1,(line){0,0,0})-li-1;i;--i)
{
int x=li[i].x,y=li[i].y;
modif(rk[x],a[y].o),modif(rk[y],a[x].o);
swap(rk[x],rk[y]);
ans=max(ans,tr[1].s);
}
printf("%d\n",ans);
return 0;
}

luogu P4385 [COCI2009]Dvapravca的更多相关文章

  1. P4385 [COCI2009]Dvapravca

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

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

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

  3. [COCI2009]Dvapravca 计算几何

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

  4. bzoj3086: Coci2009 dvapravca

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

  5. bzoj AC倒序

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

  6. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  7. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  8. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  9. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

随机推荐

  1. Django(十五)Form组件

    参考博客: https://www.cnblogs.com/haiyan123/p/7778888.html http://www.cnblogs.com/wupeiqi/articles/61441 ...

  2. OmniPlan,一款让你无法自拔的项目管理工具(仅适用于MAC系统)

      OmniPlan 大家都知道Windows系统可以使用project来方便的管理跟踪项目的各项任务,那么Mac系统有没有这样专业级的项目管理软件了?答案是有,今天给大家推荐的Mac系统下的项目管理 ...

  3. Hibernate 二(一级缓存,多表设计之一对多)

    1       对象状态与一级缓存 1.1   状态介绍 l  hibernate 规定三种状态:瞬时态.持久态.脱管态 l  状态 瞬时态:transient,session没有缓存对象,数据库也没 ...

  4. 一个小误区 JS中的contains

    在Java语言中,contains可以用于判断str1是否包含str2 原生JS中是有contains方法的 但它并不是字符串方法,,仅用于判断DOM元素的包含关系,参数是Element类型 若要在J ...

  5. django补充

    通过表名获取app的name models.UserInfo._meta.app_label >>> from repository import models >>&g ...

  6. Linux系统中/etc/rc.local和/etc/rc.d/rc.local的区别

    /etc/rc.d/rc.local 用于添加开机启动命令 /etc/rc.local是/etc/rc.d/rc.local的软连接

  7. POJ3662 SPFA//二分 + 双端队列最短路

    https://cn.vjudge.net/problem/12427/origin 题意:求1到N第K + 1大条边权最小的路径 首先想到dp递推,dp[x][y]表示到x这个点经过y条免费边的最小 ...

  8. MacOS环境中 python3 部署

    MacOS环境中 python3 部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.在MacOS安装Python3.6 1>.打开python关于MacOS版本的官方网 ...

  9. jvm_tool jconsole/ jprofiler/ JProbe/ VirtualVm/ TPV/ YourKit/ ITCAM/ MAT/ MDD4J

    S 学习jvm,关于MAT an internal error occurred during:"Parsing heap dump" from问题 https://www.cnb ...

  10. 网络编程基础【day09】:socket解决粘包问题之MD5(八)

    本节内容 1.概述 2.代码实现 一.概述 上一篇博客讲到的用MD5来校验还是用的之前解决粘包的方法,就是客户端发送一个请求,等待服务端的确认的这样的一个笨方法.下面我们用另外一种方法:就是客户端已经 ...