一个最朴实的暴力,但只有 5 pts。 赛时想到了正解但因为暴力过不了大样例 4 不敢码树状数组。
调了很久(2 h +),没有发现问题,求求了!
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const double g=9.8;
const int N=5e5+10;
const double eps=1e-7;
struct Node{
ll x,y,v;
double pos;
bool operator < (const Node &w) const
{
return y == w.y ? x < w.x : y < w.y;
}
}d[N];
ll p[N],a[N];
int n,m;
int tot;
int l[N],r[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&d[i].x,&d[i].y,&d[i].v);
d[i].pos=d[i].x+d[i].v*sqrt(2.0*d[i].y/g);
}
sort(d+1,d+1+n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(d[i].y!=d[j].y) break;
if(d[i].pos-d[j].pos>=-eps)
{
p[i]++,p[j]++;
}
}
}
ll sum=0;
for(int i=1;i<=n;i++)
{
sum+=p[i];
a[i]=min(a[i],p[i]);
}
sort(a+1,a+1+n);
for(int i=n;i>=n-m+1;i--)
{
sum-=a[i];
}
printf("%lld\n",sum);
return 0;
}
感觉可能是很煞笔的问题(