• 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
  • 相关阅读:
    Mechanism of Loading Resources
    Dashboards (Android)
    Tips: compilation and creating new projects on Android 4.0
    设备方向
    【转】字符串分割(C++)
    Moving From Objective-C to C++
    Simulate android behaviors on win32
    【ybtoj高效进阶 21265】排队问题(fhq-Treap)(构造)
    【ybtoj高效进阶 21262】头文字 D(线段树)(数学)
    【ybtoj高效进阶 21261】头文字 C(单调队列优化DP)
  • 原文地址:https://www.cnblogs.com/MXang/p/10839626.html
Copyright © 2020-2023  润新知