原題鏈結
題意:
有乙個二維平面,上面有n個點,在第乙個點上有一顆石頭。現在有兩個人做遊戲,他們輪流移動石頭,
第一次移動的時候可以將石頭移動到平面上的其他任何的點上。之後的每次移動,可以將石頭移動到比上次移動距離更遠的點上。
當輪到某人時,他無法再移動石頭,則判他為輸。
做法:
我們先考慮第一步:當前是第乙個點,如果說第乙個點和其他的某個點是平面中最長距離的點對,則先手必勝。
同樣:也就是說,如果當前點在目前平面上和其他某個點能組成為最長點對的話,當前這個人必勝。
那麼我們可以反著處理一下,在計算所有點對之間的距離後,按照距離從大到小排序之後遍歷所有點對,如果我們在遍歷點對的途中,
發現點1已經被遍歷過了並且剩下的點的個數大於1,則先手必勝,否則必敗。
#include #define debug
#define d1(x) std::cout << #x " = " << (x) << std::endl
#define d2(x, y) std::cout << #x " = " << (x) << " ," #y " = " << (y) << std::endl
#define disp(arry, fr, to) \
#define ed end()
#define bg begin()
#define mkp make_pair
#define pb push_back
#define v(t) vector#define all(x) x.bg,x.ed
#define newline puts("")
#define si(x) ((int)x.size())
#define rep(i,n) for(int i=1;i<=n;++i)
#define rrep(i,n) for(int i=0;ipii;
const int maxn = 5e6+10;
const int inf = 0x7f7f7f7f;
const ll inf_ll = 1ll*inf*inf;
const int mod = 1e9+7;
const double eps = 1e-7;
int n;
double a[2010],b[2010];
struct nodee[maxn];
double cdis(double x1,double y1,double x2,double y2)
bool cmp(node a,node b)
bool vis[maxn];
int main()
int cnt=0;
rep(i,n)
}sort(e+1,e+cnt+1,cmp);
// rep(i,cnt)
int flag=0;
int sum = n;
rep(i,cnt)
g.push_back(u),g.push_back(v),j++;
}i=j-1;
for (auto v : g)
if(vis[1] == 1 && sum > 1) flag=1;
sum-=g.size();
}if(flag) break;
}// d1(flag);
if(flag) puts("yes");
else puts("no");
}return 0;
}
點選展開**塊 杭電多校2020第7場 E Expectation
有一種做法 列舉每個球滾到哪個坑里,算出其概率,再乘上球到這個坑的距離,把結果相加。但是你會發現,這樣子很難處理,而且有許許多多複雜的情況。我們換乙個角度 對於每乙個 i 和 i 1 之間的線段,我們算其被經過的期望次數。手玩一會兒不難發現有如下結論 對於一條線段,如果其左邊為洞,右邊為球,那麼肯定...
2020杭電多校第5場
1001 tetrahedron 直角三稜錐有乙個性質 底面面積的平方等於三個側面面積的平方和。然後根據體積可以算出來h,1 h2 a2b 2 a2 c2 b 2c2a 2b2c 2 frac frac h21 a 2b2c 2a2b 2 a2 c2 b 2c2 這樣在o n 的時間是沒法算期望的,...
2020 杭電多校第6場
1009 divisibility 題意 十進位制下判斷乙個數n能否被3整除的方法是 判斷n的各位數的和能否被3整除,現給你乙個b和x,判斷再b進製下能否用這種方法判斷所有數能否整除x。打表可以找規律。include using namespace std typedef long long ll ...