题解
2025-08-09 19:30:11
发布于:广东
2阅读
0回复
0点赞
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
#define il inline
typedef long long ll;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
typedef double Grad;
int n;
struct Node{
int x,y;
int p;
char c;
}a[1005];
bool cmp(Node a,Node b){
return a.x!=b.x?a.x<b.x:a.y>b.y;
}
int s[1005];
struct Line{
int i1,i2; // id
Grad G;
Line(){} Line(int a_,int b_){i1=a_,i2=b_;G=1.0*(a[i2].y-a[i1].y)/(a[i2].x-a[i1].x);}
bool operator<(Line b){
return G<b.G;
}
}ls[1000006];
int ms=0;
vector<pair<int,int> > sw[1000006];int st;
int did[1006],id[1006];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].c=getchar(); while(a[i].c!='R' && a[i].c!='B'){ a[i].c=getchar(); }
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
s[i]=((a[i].c=='R')?0:1);
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
ls[++ms]=Line(i,j);
}
}
sort(ls+1,ls+ms+1);
st=1;sw[1].push_back(make_pair(ls[1].i1,ls[1].i2));
for(int i=2;i<=ms;i++){
if(ls[i].G!=ls[i-1].G){
st++;
}
sw[st].push_back(make_pair(ls[i].i1,ls[i].i2));
}
int ans=0;
int l=1; // 永远焕发光芒的暴力维护区间
for(int j=1;j<=n;j++){
if(s[j]==1){
l=j+1;
}
if(s[l]==0 && s[j]==0){ans=max(ans,j-l+1);}
}
for(int i=1;i<=n;i++){id[i]=did[i]=i;}
for(int i=1;i<=st;i++){
for(int j=0;j<sw[i].size();j++){
int x=sw[i][j].first,y=sw[i][j].second,u,v;
swap(did[x],did[y]);
swap(id[did[x]],id[did[y]]);
u=s[did[x]],v=s[did[y]];
s[did[x]]=v,s[did[y]]=u; // 完全没用的调试信息
}
int l=1; // 运用反复的修辞手法
for(int j=1;j<=n;j++){
if(s[j]==1){
l=j+1;
}
if(s[l]==0 && s[j]==0){ans=max(ans,j-l+1);}
}
}
printf("%d\n",ans);
return 0;
}
这里空空如也
有帮助,赞一个