HDU 5738 Eureka 極角排序,注意讀題

2021-07-16 07:02:08 字數 1279 閱讀 6188

題目大意:

平面給n<=1000個座標,每個座標值範圍在[-1e9,1e9]之間

問,隨便取一些點集,使得點集內的點,在一條直線上,有多少種方案。

方法:按照x,y座標排序。x相同,y從小到大。

這樣,我們從最左邊的點開始,讓這個點固定下來,求這個點必須取的情況下,在這個點的右邊【和上方】的直線中有多少方案。

現在問題主要是,如何找一些經過原點的直線。(求k點的時候,把k點放在原點上) 

因為k點一定是最左邊的,所以右邊的點的x座標都是大於等於0的,所有剩下的點可以極角排序,角度相同的,顯然在一條線上了……

注意,有多個點在同乙個點上的情況,要特殊處理一下。。。

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

typedef long long ll;

const int maxn = 10e5 *4 + 10;

const int mod = 1e9+7;

int n;

struct node

a[1000 + 100], b[1000 + 100];

bool cmp1(node a, node b)

void init()

sort(a + 1, a + 1 + n, cmp1);

}bool cmp2(node a, node b) //極角排序

bool xie_que(node a, node b) //兩點斜率是否相同

ll powmod( ll a , ll b , ll p = mod )//a^b % p

return r ;

}void doit()

ll same=0;

t=0;

for (j = i + 1; j <= n; ++ j)

if (!b[j].x && !b[j].y)

else break;

ans += powmod(2ll, same) -1;

ans %= mod;

if (j<=n)

ans += powmod(2, same) * (powmod(2, t) - 1);

ans %= mod;

++j;

}} }

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

}int main()

return 0;

}

HDU 5738 Eureka 共線點集

題目鏈結 題意 給出n個點,每個集合中至少存在兩個點,且他們都共線,問一共有多少個這樣的集合。對於在同乙個位置上的k個點,在這個位置上能產生的集合數為2k k 1 2 k k 1對於其他的點,遍歷每個點,再遍歷其他點,計算出斜率。對於每個相同的斜率,是在這個點位置上至少取乙個點,再在其他點上至少取乙...

E 免費餡餅 HDU 1176

e 免費餡餅 hdu 1176 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側...

E 超級密碼 HDU 1226

ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示資訊 密碼是乙個c進製的數,並且只能由給定的m個數字構成,同時密碼是乙個給定十進位制整數n 0 n 5000 的正整數倍 如果存在多個滿足條件的數,那麼最小的那個...