3.4 計算幾何

nocow中文版

mostly based on only two operations described below: cross product and arctangent.

| i  j  k  |
| ux uy uz |
| vx vy vz |
(uyvz-vyu z)i + (uzvx-u xvz)j + (uxv y-uyvx)k 


- atan2, takes two arguments: a DELTA y value and a DELTA x value (in that order!).

1 知識準備
2 操作
2.1 叉積
2.2 點積
2.3 反正切
3 全面考慮問題
4 計算幾何算法
4.1 三角形面積
4.2 兩條線段平行嗎?
4.3 多邊形面積
4.4 點到直線的距離
4.5 點在直線上
4.6 點都在直線的同側
4.7 點在線段上
4.8 點在三角形內
4.9 點在凸多邊形內
4.10 四點(或更多)共面
4.11 兩條直線相交
4.12 兩條線段相交
4.13 兩直線的交點
4.14 判斷平面內多邊形的凹凸性
4.15 點在凹多邊形內
5 幾何方法
5.1 蒙特卡洛方法(Monte Carlo)
5.2 分割技術
5.3 轉化爲圖
6 例子
6.1 Point Moving
6.2 Bicycle Routing
6.3 Maximizing Line Intersections
6.4 Polygon Classification

heritage

給出中序表達式和先序表達式求後序

後序是一個棧的思想,遍歷先序,找到對應中序位置,比棧頂大時輸出棧頂元素,然後入棧,

採取遞歸的方法建立二叉樹。首先取前序遍歷的首元素當作二叉樹的根,當前元素爲根。把前序遍歷中的當前元素當作中序遍歷的分割點,中序遍歷分割點前面的元素一定在當前元素的左子樹,分割點後面元素一定在當前元素的右子樹。然後加入下一個頂點,再把它當作分割點。如此遞歸的進行,直到二叉樹建立完成。

//我的
for (int i = 0; i < inorder.length(); i++)
    {
        for (int j = 0; j < preorder.length(); j++)
        {
            if (inorder[i] == preorder[j])
            {
                while (st.size() && j < st.top()) {
                    fout << preorder[st.top()];
                    st.pop();
                }
                st.push(j);
            }
        }
    }
    while (st.size()) {
        fout << preorder[st.top()];
        st.pop();
    }


//NOCOW
void makenode(int beg,int end)
{

    if(beg>end) return; 
    for(int i=beg;i<=end;i++)
        if(s1[i]==s2[k])
        {       
            k++;
            makenode(beg,i-1);
            makenode(i+1,end);
            fout<<s1[i];
            return;
        }
}

fence9

求三角形格點數
O(n)掃一遍,謎一樣的精度…提交了六次……

nocow真是漲知識的地方…

  • 皮克定理:
    給定頂點座標均是整點(或正方形格點)的簡單多邊形,皮克定理說明了其面積A和內部格點數目i、邊上格點數目b的關係
    A = i + b/2 - 1
    與歐拉公式等價V-E+F=2
    一條直線((0,0),(n,m))上的格點數等於n與m的最大公約數+1
    ((p*m)/2)+1-(((gcd(n,m)+1)+(gcd(abs(n-p),m)+1)+p-2)/2)

  • 二分向量法
    二分y座標即可剛開始的區間是(0,M),每次對比(x,y)和(n,m)的叉積(即求的相對方位),如果(x,y)在(n,m)的上方,那麼向下二分,否則向上二分,最後的結果是y值最接近向量(n,m)的點,求出這個點就可以知道從這個點到0有幾個點
    從源點(0,0)到(x,i)向量(x-0,i-0)與(n-0,m-0)的叉積應該大於0 二、點(n,m)到點(x,i)組成的向量(n-x,m-i)與點(n,m)到點(p,0)組成的向量(n-p,m-0)的叉積應該大於0

唱片分佈 Rockers

一開始寫DP越寫越複雜,,最後dfs居然直接0s過了……

官方dp

dp[a][b][c] being the most number of songs that we can put on the first ‘a’ CDs, with ‘b’ minutes already used up on the ‘a’th CD, and with ‘c’ being the last song that we put on CD ‘a’.

果然是狀態猜錯了QAQ
主要是一直沒有確認,只有最後一張光盤剩餘時間有意義.
搞清楚後爆搜就過了
(加了一個簡單的剪枝if (n - pos + mus > cnt))

估計主要是數據量太小,怎麼做都能過吧…
而且我的dfs居然比一些題解中的..要快…
下面是NOCOW裏面的動歸套路

f[i,j]表示1~i物品,使用空間量<=j分鐘的最大答案
f[i,j]=max{f[i-1,j], f[i-1,get(a[i],j)]+1};
然後壓成1維,a不用記錄在數組中
f[j]=max{f[j],f[get(a,j)]+1};

F[I,J]代表前I個歌曲裝在J個唱片的最優值,所以
F[I,J]:=Max{F[K,J]+Maxit[K+1,I]}

這一節內容好少..一天就做完了
估計是把相對難一點的題目放到後面章節去了吧

五月底4+2選拔賽,想要好好準備一下.
但是最近給自己花樣越來越多,
甚至還開始玩遊戲了…
保持腦力繼續向前吧.
這周(或許可以)先把離散教材的計數原理和概率刷完
21#百度之星
27#4+2選拔賽,爭取把借來的算法書看一遍.
yeap~

謝謝昨夜學術羣大家的刷屏…
我可要加倍努力
纔可能達到大神的水準吧

哈哈哈貽笑大方~

Chapter 1 DONE 2016.03.21 Getting started
Chapter 2 DONE 2016.03.23 Bigger Challenges
Chapter 3 DONE 2016.05.17 Techniques more subtle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章