半年之后的我终于把这个题过了。。。
竟然是有个边界没处理好。
dls讲的很清楚了(雾)
注:以下的钝角三角形=钝角三角形+直角三角形
求锐角三角形面积我们有两种法子
1. 求出来所有锐角的面积和所有钝角的面积,用锐角的面积-2*钝角的面积,再除以三即可。因为每个钝角三角形有两个锐角。
2.求出来总的三角形面积和钝角面积,总的先除以三,再减去钝角即可。因为每个钝角只会被计算一次。
就叉积用一下__int128就行,反正我是全用的__int128然后T自闭了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const long long mod = 998244353; 5 const ll inv3 = 332748118; 6 struct point{ 7 ll x,y; 8 point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};} 9 point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};} 10 inline int getP() const{return y>0||(y==0&&x<0);} 11 }; 12 inline __int128 cross(point k1,point k2){return (__int128)k1.x*k2.y-(__int128)k1.y*k2.x;} 13 inline int compareangle (point k1,point k2){//极角排序+ 14 return k1.getP()<k2.getP()||(k1.getP()==k2.getP()&&cross(k1,k2)>0); 15 } 16 int t,n;point p[2019]; 17 vector<point> v; 18 ll sumx[5555],sumy[5555],sdj,sal; 19 inline ll slove3(int id){ 20 v.clear(); 21 for(int i=1;i<=n;i++)if(i!=id)v.push_back(p[i]-p[id]); 22 sort(v.begin(),v.end(),compareangle); 23 int m = v.size(); 24 for(int i=0;i<m;i++)v.push_back(v[i]); 25 sumx[0]=v[0].x%mod,sumy[0]=v[0].y%mod; 26 for(int i=1;i<v.size();i++)sumx[i]=(sumx[i-1]+v[i].x)%mod,sumy[i]=(sumy[i-1]+v[i].y)%mod; 27 int q=0,s=0,t=0;//(0,90,180) 28 for(int i=0;i<m;i++){ 29 point _90 = {-v[i].y,v[i].x}; 30 point _180 = {-v[i].x,-v[i].y}; 31 q=max(i,q); 32 while (q<2*m-1&&cross(v[i],v[q+1])==0)q++;//取不到0 33 while (s<2*m-1&&(s<q||(cross(v[s+1],_90)>0&&cross(v[s+1],v[i])<=0)))s++;//取不到90 34 while (t<2*m-1&&(t<s||(cross(v[t+1],_180)>0&&cross(v[t+1],_90)<=0)))t++;//取不到180 35 point dj = {(sumx[t]-sumx[s]+mod)%mod,(sumy[t]-sumy[s]+mod)%mod}; 36 point qb = {(sumx[t]-sumx[q]+mod)%mod,(sumy[t]-sumy[q]+mod)%mod}; 37 ll sdunjiao = (cross(v[i],dj)+mod)%mod; 38 ll squanbu = (cross(v[i],qb)+mod)%mod; 39 sal+=squanbu,sal%=mod; 40 sdj+=sdunjiao,sdj%=mod; 41 } 42 } 43 int main(){ 44 scanf("%d",&t); 45 while (t--){ 46 sdj=0,sal=0; 47 scanf("%d",&n); 48 ll x,y; 49 for(int i=1;i<=n;i++){ 50 scanf("%lld%lld",&x,&y); 51 p[i].x=x,p[i].y=y; 52 } 53 for(int i=1;i<=n;i++){ 54 slove3(i); 55 } 56 sal=sal*inv3%mod; 57 ll sre = ((sal-sdj)%mod+mod)%mod; 58 printf("%lld ",sre); 59 } 60 }