傻子题。
枚举两个蓝点然后二分出可行的红点范围。
再加一个前缀和预处理优化一下即可。
时间复杂度
O
(
n
2
l
o
g
n
)
O(n^2log_n)
O(n2logn) 我也不知道为啥原题数据范围是300
代码:
#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const double eps=1e-5;
class Ear{
public:
vector<int>a;
vector<pii>b;
ll f[605][605];
int n,m;
inline ll C2(int x){return x<=0?0:(ll)x*(x-1)/2;}
inline ll C3(int x){return x<=0?0:(ll)x*(x-1)*(x-2)/6;}
inline int lower_bound(int x){
int res=0,l=1,r=n,mid;
if(x<a[1])return 0;
if(x>=a[n])return n;
while(l<=r)(x>=a[mid=l+r>>1])?(l=mid+1,res=mid):(r=mid-1);
return res;
}
inline ll getCount(vector<string>rx,vector<string>bx,vector<string>by){
string A,B,C;
for(ri i=0;i<rx.size();++i)A=A+rx[i];
for(ri i=0;i<bx.size();++i)B=B+bx[i];
for(ri i=0;i<by.size();++i)C=C+by[i];
stringstream sa(A),sb(B),sc(C);
int x,y;
a.clear(),b.clear();
while(sa>>x)a.push_back(x);
while(sb>>x)sc>>y,b.push_back(pii(y,x));
n=a.size(),m=b.size();
a.push_back(-1e9),b.push_back(pii(-1e9,-1e9));
sort(a.begin(),a.end());
sort(b.begin(),b.end());
ll ret=0;
for(ri i=1;i<=n;++i)for(ri j=n;j;--j)f[i][j]=0;
for(ri i=1;i<=n;++i)for(ri j=n;j;--j)f[i][j]=C2(j-i-1)+f[i-1][j]+f[i][j+1]-f[i-1][j+1];
ll det;
double t;
for(ri x,L,R,M,ql,qr,i=1;i<m;++i){
for(ri j=i+1;j<=m;++j){
if(b[i].fi==b[j].fi)continue;
if(b[i].se==b[j].se){
x=lower_bound(b[i].se);
if(x<2||x==n)continue;
ql=x-(b[i].se==a[x]),qr=x+1;
det=f[ql][qr];
int tt=a[x]==b[i].se?x:x+1;
det-=(ll)ql*C3(n-tt+1);
tt=x;
det-=(ll)(n-qr+1)*C3(tt);
}
else if(b[i].se<b[j].se){
t=(double)((ll)b[i].se*b[j].fi-(ll)b[i].fi*b[j].se)/(double)(b[j].fi-b[i].fi);
x=floor(t);
L=lower_bound(x);
R=lower_bound(b[j].se);
M=lower_bound(b[i].se);
L+=t-a[L]>=eps;
if(L<2||R>n-1)continue;
ql=L-1,qr=R+1;
det=f[ql][qr];
int tt=a[M]==b[i].se?M:M+1;
det-=(ll)ql*(C3(n-tt+1)-C3(R-tt+1));
tt=M;
det-=(ll)(n-R)*(C3(tt)-C3(tt-L+1));
}
else{
t=(double)((ll)b[i].se*b[j].fi-(ll)b[i].fi*b[j].se)/(double)(b[j].fi-b[i].fi);
x=floor(t);
R=lower_bound(x);
L=lower_bound(b[j].se);
M=lower_bound(b[i].se);
L+=b[j].se!=a[L];
if(L<2||R>n-1)continue;
ql=L-1,qr=R+1;
det=f[ql][qr];
int tt=a[M]==b[i].se?M:M+1;
det-=(ll)ql*(C3(n-tt+1)-C3(R-tt+1));
tt=M;
det-=(ll)(n-R)*(C3(tt)-C3(tt-L+1));
}
ret+=det;
}
}
return ret;
}
};
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务