AT3526 [ARC082C] ConvexScore
题面传送门
吐槽一下为什么求一次函数解析式然后暴力带入会WA,然后求斜率比较就对了啊。
首先那个式子不是很好处理,我们来考虑这个式子的组合意义。
容易想到这个就是非边界上的点选与不选,即选点集能构成凸包的方案数。
然后这个容斥一下,枚举共线点即可。
时间复杂度\(O(n^3)\)
code:
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#include<bitset>
#include<set>
#include<map>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define l(x) x<<1
#define r(x) x<<1|1
#define re register
#define ll long long
#define db double
#define N 300
#define eps (1e-5)
#define mod 998244353
#define U unsigned
using namespace std;
int n,pus;ll ans,po[N+5];
struct point{double x,y;}F[N+5];
I db slope(int a,int b){return F[a].x==F[b].x?1e9:(F[b].y-F[a].y)/(F[b].x-F[a].x);}
I bool cmp(point x,point y){return x.x<y.x;}
int main(){
freopen("1.in","r",stdin);
int i,j,h;scanf("%d",&n);po[0]=1;for(i=1;i<=n;i++) scanf("%lf%lf",&F[i].x,&F[i].y),po[i]=po[i-1]*2%mod;ans=po[n]-n-1;sort(F+1,F+n+1,cmp);
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++){
for(pus=0,h=i+1;h<j;h++) pus+=(slope(i,h)==slope(j,h));ans-=po[pus];
}
}
printf("%lld\n",(ans%mod+mod)%mod);
}