ABC274F
[[discretization]] [[difference]]
一条鱼相当于一个向量,记一个初始点,一个速度
那么我们可以 \(O(n^2)\) 算出任何两条鱼距离为 len 的时间区间(定一条鱼在最前面)
不妨让网的边界放在鱼上,那么我们对每条鱼就是求这些时间区间的交的最大贡献
离散化之后可以差分实现区间加
复杂度:\(O(n^2\log n)\)
#include<bits/stdc++.h>
using namespace std;
int n,len,c,cnt;
const int N=4003;
struct F{
int x,v,w;
}fish[N];
struct IT{
double l,r;
int w;
}_[N];
double t1,t2,all[N];
long long ans,dif[N],an;
int main(){
scanf("%d%d",&n,&len);
for(int i=1,a,b,c;i<=n;i++)scanf("%d%d%d",&a,&b,&c),fish[i]={b,c,a};
for(int i=1;i<=n;i++){
an=c=cnt=0;
for(int j=1;j<=n;j++){
double _1=fish[j].x-fish[i].x;
double _2=fish[i].v-fish[j].v;
if(_2!=0){
t1=_1/_2;
t2=(_1-len)/_2;
if(t1>t2)swap(t1,t2);
if(t1<0&&t2<0)continue;
if(t2>0&&t1<0)t1=0;
all[cnt++]=t1,all[cnt++]=t2;
_[c++]={t1,t2,fish[j].w};
}else if(_1>=0&&_1<=len)dif[0]+=fish[j].w;
}
sort(all,all+cnt);
for(int i=0;i<c;i++){
dif[lower_bound(all,all+cnt,_[i].l)-all]+=_[i].w;
dif[lower_bound(all,all+cnt,_[i].r)-all+1]-=_[i].w;
}
for(int i=0;i<=cnt;i++)i!=0&&(dif[i]+=dif[i-1]),an=max(an,dif[i]);
ans=max(an,ans);
for(int i=0;i<cnt;i++)all[i]=0;
for(int i=0;i<=cnt;i++)dif[i]=0;
for(int i=0;i<c;i++)_[i]={0,0,0};
}
printf("%lld\n",ans);
}

浙公网安备 33010602011771号