18 BJ J

半年之后的我终于把这个题过了。。。

竟然是有个边界没处理好。

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 }
View Code
原文地址:https://www.cnblogs.com/MXang/p/10839626.html