https://vjudge.net/contest/388843#problem/G
Dodo bird and ddd are playing a stone game on a 2-d plane. There are $n$ points on the plane where they can put the stone. The rule is as follows:
- Before the game start, The stone is at the first point.
- Dodo and ddd move the stone in turn, Dodo moves first.
- In the first move, the player can move the stone to any point except the first point.
- Starting from the second move, assume the stone is currently at point $x$, and the distance of the stone traveled in the last move is $d$. The player can move the stone to a point $y$ if and only if $ ext{distance(x,y)} > d$ and point $y$ has never been visited before.
- If a player cannot make a move, he loses the game.
Please determine who will win the game if both player use the best strategy.
InputThe first line contains an integer $T(1 leq T leq 100)$, indicating the number of test cases.
Each test case contains several lines. The first line contains an integer $n(2 leq n leq 2000)$, indicating the number of points. Next $n$ lines, each line contains two integers $x_i, y_i(-10^9 leq x, y leq 10^9)$, indicating the coordinate of the i-th point.
It is guaranteed that there are at most 12 test cases with $n > 500$.
OutputFor each test case, If Dodo can win the game, print "YES". Otherwise, print "NO".Sample Input
2 5 1 1 0 0 2 0 0 2 2 2 4 1 1 0 0 0 2 2 2
Sample Output
NO YES
Sponsor
题意:
A,B轮流走,每次走的距离比上一次大。走过的点不能再走,不能走的人输,问先手是否必胜。
思路:
参考 https://blog.csdn.net/tomjobs/article/details/107947511
最后走到最远距离的一对点,一人先走到这些点中行动,另一人就不能再行动了。
最多只剩下一个最远点 偶数先手胜
最后只剩下一个点且为点1,1必败。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include <vector>
#include <iterator>
#include <utility>
#include <sstream>
#include <limits>
#include <numeric>
#include <functional>
using namespace std;
#define gc getchar()
#define mem(a) memset(a,0,sizeof(a))
#define debug(x) cout<<"debug:"<<#x<<" = "<<x<<endl;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pii;
typedef char ch;
typedef double db;
const double PI=acos(-1.0);
const double eps=1e-6;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
const int maxm=2007;
//const int maxm=100+10;
const int N=1e6+10;
const int mod=1e9+7;
struct node
{
ll x , y , d;
};
node A[maxm];
node Path[maxm*maxm];
int v[maxm] = {0};
int cmp(node x,node y)
{
return x.d < y.d;//递增
}
ll D(int i,int j)
{
int ans = (A[i].x-A[j].x)*(A[i].x-A[j].x)+(A[i].y-A[j].y)*(A[i].y-A[j].y);
return ans;
}
int main() {
int T = 0;
cin >> T;
while(T--)
{
int n = 0;
cin >> n;
for(int i = 0;i<n;i++)
{
cin >> A[i+1].x >> A[i+1].y;
v[i] = 0;
}
int L = 0;
for(int i = 0;i<n;i++)
{
for(int j = i;j < n;j++)
{
L += 1;
Path[L].x = i+1;
Path[L].y = j+1;
Path[L].d = D(i+1,j+1);
}
}
sort(Path+1,Path+1+L,cmp);
int X = 0;
int Y = 0;
for(int i = 0;i<L;i++)
{
X = Path[L-i].x;
Y = Path[L-i].y;
if(v[X] || v[Y])
{
continue;
}
else
{
n = n - 2;
v[X] = 1;
v[Y] = 1;
}
}
if(n == 0)
{
cout << "YES" <<endl;
}
if(n == 1)
{
if(v[1]) cout << "YES" <<endl;
}
if(n !=0 && n != 1) cout << "NO" <<endl;
}
return 0;
}