Description

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

Input

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

Output

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

Sample Input

4
0 0 R
0 1 B
1 1 R
1 0
B

Sample Output

2
 

先考虑一下如果这两条直线必须与x轴垂直怎么做,我们先可以将所有点按x为第一关键字,y为第二关键字排序,在这个排好序的序列中找到最长的一段红色就是答案了(用线段树维护)

然后我们把坐标系旋转,如果y轴扫过了两点连成的直线,则这两个点的排名就会交换,旋转一周交换的点对为O(N2)个,所以可以用一个线段树来维护区间最长红点数,支持单点修改和查询,复杂度O(N2logN)。

code:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 1005
using namespace std;
int n,m,a,b,ans,pos[maxn];
char s[];
inline int min(const int &a,const int &b){
int diff=b-a;
return a+(diff&(diff>>));
}
inline int max(const int &a,const int &b){
int diff=b-a;
return b-(diff&(diff>>));
}
struct Point{
int x,y,col;
}point[maxn];
inline bool cmp1(Point a,Point b){
if (a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
struct Line{
int a,b,x,y;
}line[maxn*maxn];
inline bool cmp2(const Line &a,const Line &b){return 1LL*a.x*b.y<1LL*a.y*b.x;}
inline bool cmp(const Line &a,const Line &b){return 1LL*a.x*b.y==1LL*a.y*b.x;}
struct Seg{
#define ls k<<1
#define rs (k<<1)+1
int val[maxn<<],lmax[maxn<<],rmax[maxn<<],col[maxn<<];
inline void update(int k){
col[k]=col[ls]|col[rs];
lmax[k]=(col[ls])?lmax[ls]:lmax[ls]+lmax[rs];
rmax[k]=(col[rs])?rmax[rs]:rmax[ls]+rmax[rs];
val[k]=max(rmax[ls]+lmax[rs],max(val[ls],val[rs]));
}
inline void modify(int k,int l,int r,int x,int c){
if (l==r){val[k]=lmax[k]=rmax[k]=c^,col[k]=c;return;}
int m=(l+r)>>;
if (x<=m) modify(ls,l,m,x,c); else modify(rs,m+,r,x,c);
update(k);
}
}T;
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%d%d%s",&point[i].x,&point[i].y,s);
point[i].col=(s[]=='B'),pos[i]=i;
}
sort(point+,point+n+,cmp1);
for (int i=;i<=n;i++) for (int j=i+;j<=n;j++)
line[++m]=(Line){i,j,point[j].x-point[i].x,point[j].y-point[i].y};
sort(line+,line+m+,cmp2);
for (int i=;i<=n;i++) T.modify(,,n,i,point[i].col);
ans=T.val[];
for (int i=,j=;i<=m;i=j){
for (;j<=m&&cmp(line[i],line[j]);j++){
a=line[j].a,b=line[j].b;
T.modify(,,n,pos[b],point[a].col);
T.modify(,,n,pos[a],point[b].col);
swap(pos[a],pos[b]);
ans=max(ans,T.val[]);
}
}
printf("%d\n",ans);
return ;
}

省队集训day6 C的更多相关文章

  1. 省队集训day6 B

    一道AC自动机题···· 一定要把一个节点没有的儿子接到它fai的儿子,否则会卡到n^2的······· #include<cstdio> #include<iostream> ...

  2. 省队集训day6 A

    code: #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...

  3. 省队集训 Day6 序列

    [题目大意] 给出$n$个数的序列$a_1, a_2, ..., a_n$,有$m$次操作,为下面三种: $A~l~r~d$:区间$[l,r]$,全部加$d$. $M~l~r~d$:区间$[l,r]$ ...

  4. HN2018省队集训

    HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...

  5. JS省队集训记

    不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...

  6. LOJ #6074. 「2017 山东一轮集训 Day6」子序列

    #6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...

  7. [2018HN省队集训D9T1] circle

    [2018HN省队集训D9T1] circle 题意 给定一个 \(n\) 个点的竞赛图并在其中钦定了 \(k\) 个点, 数据保证删去钦定的 \(k\) 个点后这个图没有环. 问在不删去钦定的这 \ ...

  8. [2018HN省队集训D8T1] 杀毒软件

    [2018HN省队集训D8T1] 杀毒软件 题意 给定一个 \(m\) 个01串的字典以及一个长度为 \(n\) 的 01? 序列. 对这个序列进行 \(q\) 次操作, 修改某个位置的字符情况以及查 ...

  9. [2018HN省队集训D8T3] 水果拼盘

    [2018HN省队集训D8T3] 水果拼盘 题意 给定 \(n\) 个集合, 每个集合包含 \([1,m]\) 中的一些整数, 在这些集合中随机选取 \(k\) 个集合, 求这 \(k\) 个集合的并 ...

随机推荐

  1. Codeforces Round #259 (Div. 2) D. Little Pony and Harmony Chest 状压DP

    D. Little Pony and Harmony Chest   Princess Twilight went to Celestia and Luna's old castle to resea ...

  2. JAVA工程师面试总结

    HR面: 你为什么要离职?如果是公司层面的,公司为什么要这么做? 你的理想薪资?你觉得你有什么优势胜任你应聘的工作? 你的未来发展规划? BOSS面: 项目的东西,hibernate调优?使用了什么数 ...

  3. Mac下Intellij IDea发布Java Web项目详解五 开始测试

    测试前准备工作目录 Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intell ...

  4. lightoj 1198 最大权重匹配

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1198 #include <cstdio> #include <cst ...

  5. J - A Bug's Life - poj2492

    这个题目很有意思啊,有一些bug生物(肯定是程序员养的),有人观察他们的生活习惯,观察他们之间是否有同性恋关系,比如ab发生关系,bc发生关系,ab发生关系...产生了同性恋了,你需要判断一下这种关系 ...

  6. hdoj 2085 核反应堆【水】

    核反应堆 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. Java中的 修饰符

    java中的修饰符分为类修饰符,字段修饰符,方法修饰符. 根据功能的不同,主要分为以下几种. 1.权限访问修饰符  访问权限的控制常被称为具体实现的隐藏 把数据和方法包进类中,以及具体实现的隐藏,常共 ...

  8. 字符串的encode与decode解决乱码问题

    !/usr/bin/env python coding=utf-8 s="中文" if isinstance(s, unicode): s=u"中文" prin ...

  9. ORACLE功能GREATEST功能说明具体实例

    1           语法 GREATEST(expr_1, expr_2, ...expr_n) 2           说明 GREATEST(expr_1, expr_2, ...expr_n ...

  10. Flash上传组件之SWFUpload文件上传

    一.什么是SWFUpload? SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而 ...