3298: [USACO 2011Open]cow checkers

3298: [USACO 2011Open]cow checkers

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 65  Solved: 26
[Submit][Status][Discuss]

Description

   一天,Besssie准备和FJ挑战奶牛跳棋游戏。这个游戏上在一个M*N(1<=M<=1,000,000;1<=N<=1,000,000)的棋盘上, 
这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,棋盘的右上角是坐标(M-1,N-1)。 
Bessie每次都是第一个移动棋子,然后Bessie与Fj轮流移动。每一轮可以做以下三种中的一种操作:  
1)在同一行,将棋子从当前位置向左移动任意格; 
2)在同一列,将棋子从当前位置向下移动任意格;  
3)将棋子从当前位置向下移动k格再向左移动k格(k为正整数,且要满足移动后的棋子仍然在棋盘上)

第一个不能在棋盘上移动的人比赛算输(因为棋子处在(0,0)点)。 
共有T个回合(1<=T<=1,000),每次给出一个新起始点的坐标(x,y),确定是谁赢。

Input

第1行:两个用空格隔开的整数M和N;  
第2行:一个整数T;  
第3到第T+2行:两个用空格隔开的整数x和y.

Output

 

第1到T行:包含“Farmer John”或者是“Bessie”,表示谁赢了这轮游戏。




Sample Input

3 3
1
1 1

Sample Output

Bessie

HINT

Source

Silver

题解:实际上,一上来此题目不难想到可以通过DP(或者记忆化搜索也行)来搞,但这样问题来了——N,M<=1000000,显然会爆。。。

于是只好来另辟蹊径——(明确两个概念: 死点:表示当某一方在还未走这一步之前如果落到了这个位置将必死无疑的点 活点:正好相反)

1.题目中说从(N-1,M-1)走到(0,0),既然这样,我们何不看作从(0,0)走到(N-1,M-1)呢?

2.题目中说可以横向走,可以纵向走,可以斜向走,这不就意味着只要某一点被认定为死点,则这一个点横向、纵向、斜向上的其他点都是活点么(很明显如果某人走到了死点横向、斜向、纵向上的其他点上的话,他就可以把对手一步送到死点上,结束战斗。。。)

3.由2可知,所有的死点必然不在同一行,同一列,同一对角线上,也就是说对于某一x或者y坐标而言,其上死点的坐标是唯一的

4.所以综上所述,可以通过简单的O(N)预处理来实现求出每一个x坐标上的死点位置,然后接下来对于每个询问只要O(1)判断是否相同即可

于是,我们来开始找规律:

如上图,黑色的斜线表示对称轴,蓝箭头连着的是对称的,而红色箭头均为与对称轴平行的线,很明显所有下半边的点所在的线间隔都是1单位,这样一来规律就很分明了——对于当前的x坐标,要么已经通过之前的某点对称得到了结果,如果没得到的话,那就根据上一个同侧的点从斜线方向挪一格,然后对称一下得出上半边那个点,实现快速求解

 1 /**************************************************************
 2     Problem: 3298
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:72 ms
 7     Memory:4132 kb
 8 ****************************************************************/
 9
10 var
11    i,j,k,l,m,n:longint;
12    a:array[0..1000005] of longint;
13 function max(x,y:longint):longint;
14          begin if x>y then max:=x else max:=y; end;
15 begin
16      fillchar(a,sizeof(a),-1);
17      a[0]:=0;l:=0; readln(n,m);
18      for i:=1 to max(m,n) do
19          begin if a[i]>-1 then continue;
20          inc(l);a[i]:=i+l;if (i+l)<=1000005 then a[i+l]:=i; end;
21      readln(n);
22      for i:=1 to n do
23          begin
24               readln(j,k);
25               if k>j then begin l:=k;k:=j;j:=l end;
26               if a[j]<>k then writeln(‘Bessie‘) else writeln(‘Farmer John‘);
27          end;
28 end.
时间: 2024-10-22 09:52:08

3298: [USACO 2011Open]cow checkers的相关文章

bzoj 3298: [USACO 2011Open]cow checkers -- 数学

3298: [USACO 2011Open]cow checkers Time Limit: 10 Sec  Memory Limit: 128 MB Description 一天,Besssie准备和FJ挑战奶牛跳棋游戏.这个游戏上在一个M*N(1<=M<=1,000,000;1<=N<=1,000,000)的棋盘上, 这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,棋盘的右上角是坐标(M-1,N-1). Bessie每次都是第一个移动棋子,然后Bessie与

【bzoj3298】[USACO 2011Open]cow checkers

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3298 博弈论经典结论题,我也没什么好说的.matrix67大佬比我想得深入的多:捡石子游戏. Wythoff 数表和一切的 Fibonacci 数列 代码: #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> #inc

BZOJ Usaco 1616 Cow Travelling

一开始还以为是BFS,但是发现卧槽写挫了.后来想了想如果去掉参数T,那么就是一个棋盘形DP了.那题目不过多了一个T,只需要DP加一维就可以了啊.=W= 还是我太菜了 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4   5 using namespace std; 6   7 int n,m,t; 8 int Map[122][122]; 9 int Ex,Ey,Sx,Sy; 10 int

usaco 过路费 Cow Toll Paths, 2009 Dec

Description 翰家有 N 片草地,编号为 1 到 N ,彼此之间由 M 条双向道路连接,第 i 条道路连接了 Ai 和Bi,两片草地之间可能有多条道路,但没有道路会连接同一片草地,现有的道路可以保证任意两片草 地都是连通的. 有一天,约翰宣布奶牛走路要收过路费,只要奶牛走过第 i 条道路,就要收费 Li 元.此外,约 翰还要求每头奶牛购买牌照,他为每片草地设置了牌照标准,如果奶牛购买的牌照价格低于某片草地 的标准,她将被禁止进入那片草地.第 i 片草地的牌照标准为 Ci. 新政策一出,

【USACO】Cow Pedigrees(DP)

dp[i][j]代表总结点数为i的,高度不超过j的树的种类 dp[i][j] += dp[k][j] * dp[i - k - 1][j]; 注意取余的情况 结果为 dp[n][k] - dp[n][k - 1] /* ID: 18906421 LANG: C++ PROG: nocows */ #include<cstdio> using namespace std; const int maxn = 205; const int mod = 9901; int n,k; int dp[ma

USACO 2.3 Cow Pedigrees

Cow Pedigrees Silviu Ganceanu -- 2003 Farmer John is considering purchasing a new herd of cows. In this new herd, each mother cow gives birth to two children. The relationships among the cows can easily be represented by one or more binary trees with

bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOnline/problem.php?id=2581 这题我一看就知道自己不会了,只想了个O(2^n * 2 ^ n)即O(2 ^ 2n)的大暴力,也懒得打了,果断看solution. 看了之后惊呆了,看到了一种从未见过,闻所未闻的树叫做And-Or Tree,百度了一下,并没有官方中文翻译,姑且叫他"

[USACO 6.1.3] Cow XOR

题目大意 给出一个序列,求一个连续的子序列的异或和最大. 题解 先探究一下异或的性质. 1.可逆性: A XOR B XOR B = A; 2.满足结合律: (A XOR B) XOR C = A XOR (B XOR C); 利用以上两个性质有助于我们解题. 假设有一序列 A1,A2,A3......An-1,An ,可以得到另一序列 B1,B2,B3......Bn-1,Bn ,其中Bi表示A序列前i个元素的异或和. 所以,要求A序列从i到j的异或和就是Bj-Bi-1. 用这个结论就可以写一

USACO 2.4 Cow Tours

Cow Tours Farmer John has a number of pastures on his farm. Cow paths connect some pastures with certain other pastures, forming a field. But, at the present time, you can find at least two pastures that cannot be connected by any sequence of cow pat