zoj3648 網格點銳角三角形方案數

2021-07-02 20:18:48 字數 1647 閱讀 7789

題意:

求n x m的矩形網格中有多少個以格點為頂點的銳角三角形。1<=n,m<=100

解法:

首先注意到任意乙個三角形可以唯一確定乙個包含它的最小矩形,並且三角形至少有乙個頂點在矩形的頂點上。

然後可以發現,對於任意的銳角三角形,三個頂點一定都在矩形的邊上。

如果我們知道給定大小的矩形上有多少個銳角三角形,我們就可以列舉矩形大小,算出大矩形內有多少個小矩形,乘上小矩形上的銳角三角形個數,最後再求和就可以了。

現在問題就是求給定大小的矩形上有多少個銳角三角形。設矩形大小為(i, j),不妨令三角形的乙個頂點在(i, j)上,如圖。

現在要求alpha和beta都是銳角,用向量點積或者餘弦定理都可以解出q*j>p*(i-p)以及p*i>q*(j-q),且0。列舉p的話,q的解集是可以o(1)算出來的(乙個一次不等式解集和乙個二次不等式解集的交)。頂點在其它三個點的情況類似。

這樣對於給定的(i, j),銳角三角形的個數就可以o(n)求出。所以對於所有的(i, j),只需要o(n^3)時間預處理統計。

具體實現時候,我用了當p遞增時關於q的二次不等式解集的兩個邊界一增一減的性質,這樣可以避免浮點運算和一大堆亂七八糟的討論。

注:看完題解自己敲了一遍,在不等式求解的部分各種出錯。

1.關於p,q的取值。    0

p只取了右側等號,相當於左圖的情況 cal( i , j )。 這樣右圖的情況可以用 cal( j , i ) 來計算

矩形大小為 i, j  時,方案數為 2 *  (cal( i , j )+cal( j , i ))

2. 二次不等式求解

p增大的過程中不斷壓縮l,r的大小       

while (ll*(j-l))     l++;

while (r>0 && l<=r && p*i>r*(j-r))   r- -;

#include #include #include #include #include #include #include using namespace std;

typedef long long ll;

ll f[200][200];

ll cal(int i,int j)

return res;

}int main()

ll cal(ll n)

int main()

}printf("%lld\n",ans);

}return 0;

}

960網格系統

可以幫助我們在ps中快速布局 12欄,16欄,24欄 我們也可以利用css樣式表模板快速寫網頁 兩欄布局網頁部分 id class container 12 class grid 12 工具欄div div div class container 12 id header class grid 2 ...

1 網格系統

第乙個例子 建立一行 然後,新增是需要的列 col 類中設定 第乙個星號 表示響應的裝置 sm,md,lg 或 xl,第二個星號 表示乙個數字,同一行的數字相加為 12。第二個例子 不在每個col上新增數字,讓 bootstrap 自動處理布局,同一行的每個列寬度相等 兩個 col 每個就為 50 ...

2 網格模型

1.建立幾何模型 var geometry new three.spheregeometry 60,40,40 建立乙個球體幾何物件 var geometry new three.boxgeometry 100,100,100 建立乙個立方體幾何物件geometry 2.建立材質 var mater...