日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[XSY3381] 踢罐子(几何)

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [XSY3381] 踢罐子(几何) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

XSY3381

點被選為點對之一的貢獻我們單獨計算(這部分貢獻的總和為4n(n?1)(n?2)4n(n-1)(n-2)4n(n?1)(n?2))。接下來只討論剩余部分的貢獻。

先把任意三個點構成的六種選擇方案合并,發現在外接圓周和弦之間的點每個有2的貢獻,在外接圓上的點每個有1的貢獻。

然后考慮任意四個點A,B,C,DA,B,C,DA,B,C,D的貢獻。
發現當四個點構成凸四邊形ABCDABCDABCD
∠A+∠D=180°\angle A+\angle D=180\degreeA+D=180°
A,B,C,DA,B,C,DA,B,C,D四點共圓,即其中一個點在另外三個點構成的三角形的外接圓上,因此A,B,C,DA,B,C,DA,B,C,D四個點每個有1的貢獻,A,B,C,DA,B,C,DA,B,C,D四點的貢獻為4。

∠A+∠D<180°\angle A+\angle D<180\degreeA+D<180°
則必有∠B+∠C>180°\angle B+\angle C>180\degreeB+C>180°
DDD△ABC\triangle ABCABC的外接圓外,選A,B,CA,B,CA,B,C為點對時,DDD無貢獻。同理AAA無貢獻。
BBB△ACD\triangle ACDACD的外接圓弧和弦之間,選A,C,DA,C,DA,C,D為點對時,BBB有2的貢獻。同理CCC有2的貢獻。A,B,C,DA,B,C,DA,B,C,D四點的貢獻為4。

∠A+∠D>180°\angle A+\angle D>180\degreeA+D>180°
則必有∠B+∠C<180°\angle B+\angle C<180\degreeB+C<180°。類似上種情況。

四個點構成凹四邊形時,易證四個點產生的貢獻為0。

因此問題轉化為統計凸四邊形個數。

給出四個構成凸四邊形的點,任選兩個點連邊,有4種情況剩下兩個點在連邊同側,2種情況剩下兩個點在連邊異側。

給出四個構成凹四邊形的點,任選兩個點連邊,有3種情況剩下兩個點在連邊同側,3種情況剩下兩個點在連邊異側。

因此設整張圖中有aaa個凸四邊形,bbb個凹四邊形,
X=∑i<ji,j連邊,再無序地選兩個點,選的點在連邊同側的方案數X=\sum_{i<j}i,j連邊,再無序地選兩個點,選的點在連邊同側的方案數X=i<j?i,j
Y=∑i<ji,j連邊,再無序地選兩個點,選的點在連邊異側的方案數Y=\sum_{i<j}i,j連邊,再無序地選兩個點,選的點在連邊異側的方案數Y=i<j?i,j

可列出方程:
{4a+3b=X2a+3b=Y\begin{cases}4a+3b=X\\2a+3b=Y\end{cases}{4a+3b=X2a+3b=Y?

解得:

a=X?Y2a=\frac{X-Y}{2}a=2X?Y?

具體實現上,
對于每個點,把剩下的所有點按照和它的連線的斜率排序,求斜率可以用atan2latan2latan2l函數(加上lll避免爆精度)

然后,考慮兩個點的連線,設連線兩側的點數分別是LLLRRR(注意這里要判斷,不能構成了一個箭頭的形狀)

選兩個點在連線同側的有(L?1)L+(R?1)R2\frac{(L?1)L+(R?1)R}{2}2(L?1)L+(R?1)R?種情況,選兩個點在連線異側的有L×RL\times RL×R種情況。

時間復雜度O(n2logn)O(n^2logn)O(n2logn)

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define pi acos(-1) using namespace std; typedef long long ll; const int N=2010; int n,tot; double x[N],y[N],k[N]; ll ans=0; int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; } int main(){n=read();for(int i=1;i<=n;i++){x[i]=read();y[i]=read();}ans=4ll*n*(n-1)*(n-2);for(int i=1;i<=n;i++){tot=0;for(int j=1;j<=n;j++){if(i==j) continue;k[++tot]=atan2l(x[j]-x[i],y[j]-y[i]);if(k[tot]<0) k[tot]+=pi*2;}sort(k+1,k+tot+1);for(int j=1;j<=tot;j++){k[j+tot]=k[j]+pi*2;} for(int j=1,t=1;j<=tot;j++){while(t<=tot*2&&(k[t]<k[j]+pi)) t++;int l=t-j-1;int r=n-1-l-1;ans+=(1ll*l*(l-1)/2+1ll*r*(r-1)/2-1ll*l*r)*2ll;}}printf("%lld\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的[XSY3381] 踢罐子(几何)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。