poj 2318 二分 叉積

2021-09-10 19:52:57 字數 1187 閱讀 3690

n個隔板和m個玩具位置均已知,n個隔板將矩形盒子分為n+1個區域。已知隔板可看作上端點在矩形的上邊,下端點在矩形的下邊的一條線段。且隔板是按照從左到右的順序輸入的。問每個區域內有幾個玩具。

1.二分:假如第i個玩具在第x個隔板的左側,那麼一定在第y(y > x)個隔板的左側,符合單調性,可以二分。

poj 2398和這道題類似,主要是隔板未排序,按照隔板的中點按橫座標從小到大排序即可,按要求輸出即可。

2.叉積:判斷第i個玩具在第x個隔板的左側可以用叉積,假設第i個玩具所在a點,第x個隔板的上端點在b點,第x個隔板的下端點在c點。那麼如果 向量ab × 向量ac < 0,那麼a點在bc線段(直線也可這麼判斷)的左側。

3.判斷點在直線的哪一側的具體講解:

4.難得一見的一次編譯(是編譯不是提交!!!)直接ac,本來以為二分得調半天,結果一次編譯都過了,連改都沒改!

#include#includeusing namespace std ;

#define n 5005

int n , m , x1 , y1 , x2 , y2 ;

int ans[n] ;

struct part

part[n] ;

struct toy

toy[n] ;

int cal(int x , int k)//判斷第x個玩具和第k個隔板的位置關係

int judge(int x) //二分判斷x在哪一部分

return r ;

}void solve()

num = judge(i) ;

ans[num] ++ ; }}

int main()

part[n].x1 = x2 ;

part[n].y1 = y1 ;

part[n].x2 = x2 ;

part[n].y2 = y2 ;

for(i = 0 ; i < m ; i ++)

scanf("%d%d" , &toy[i].x , &toy[i].y) ;

memset(ans , 0 , sizeof(ans)) ;

solve() ;

for(i = 0 ; i <= n ; i ++)

printf("%d: %d\n" , i , ans[i]) ;

printf("\n") ;

}}

叉積 二分 poj2318

1 通過結果的正負判斷兩向量之間的順逆時針關係 若 a x b 0表示a在b的順時針方向上 若 a x b 0表示a在b的逆時針方向上 若 a x b 0表示a在b共線,但不確定方向是否相同 2 判斷折線拐向,可轉化為判斷第三點在前兩的形成直線的順逆時針方向,然後判斷拐向。3 判斷乙個點在一條直線的...

POJ2318(叉積 二分)

題意 給了m個點,落在n 1個區域中,問各個區域有多少個點。思路 玩具的點和隔板的上下頂點連的邊求叉積,如果小於0,說明點在隔板左邊,用二分找每個隔板區間對應的玩具數。include include include include include include include include in...

POJ 2318 TOYS(二分 叉積)

傳送門 設點a 假如a在乙個板子1的左邊 那他肯定也在乙個板子2左邊 而且板子還是按順序排的 滿足單調性 可以二分 考慮check 判斷點a在直線l左邊 只需判斷a到直線l的端點1 端點2兩個向量的叉積小不小於0 include include include include include def...