题解:P12596 测速仪惊吓
Aamumatematiikka · · 题解
拿到题目我们可以注意到点
我们先利用向量的叉积预处理出每个小三角形的面积的
双指针的具体过程:
当选中区间的值没有到达
由于是环形,所以可以将序列复制一遍。
代码如下:
#include <iostream>
using namespace std;
typedef long long ll;
const ll N=200005, INF=0x3f3f3f3f3f3f3f3f;
ll n, x[N], y[N], xp, yp, a[N], sum=0, tot=0, ans=INF;
ll S(ll a, ll b){
return (x[a]-xp)*(y[b]-yp)-(y[a]-yp)*(x[b]-xp);
}
int main(){
scanf("%lld",&n);
for(ll i=1;i<=n;i++) scanf("%lld%lld",&x[i],&y[i]);
scanf("%lld%lld",&xp,&yp);
for(ll i=1;i<n;i++) sum+=a[i]=S(i,i+1);
sum+=a[n]=S(n,1);
for(ll i=n+1;i<=2*n;i++) a[i]=a[i-n];
for(ll l=1,r=1;l<=2*n;tot-=a[l++]){
while(2*tot<sum&&r<=2*n) tot+=a[r++];
ans=min(ans,min(abs(2*tot-sum),abs(2*(tot-a[r-1])-sum)));
}
return printf("%lld",ans)&0;
}
预处理复杂度为