Problem H Description 喵星人和汪星人玩游戏。 这个游戏是这样的,有n个石子排成一排,其中第m个是白色的,其他都是黑色的,喵星人先走,汪星人后走,每步可以颠倒任意连续k个石头的顺序,且这k个石头中必须存在白色石头。谁先将白色石头移动到位置l谁就获胜,假设喵星人和汪星人都是选择最优的走法,问谁将获胜。 Input 第一行输入一个数T,表示测试数据个数,对于每组测试数据,输入四个数n,m,k,l(1<n<=10^6,1<=m,k,l<=n),数据保证刚开始时白色石头不在位置l。 Output 对于每组测试数据,如果喵星人获胜,输出"Miao",如果汪星人获胜,输出"Wang",如果谁也无法获胜,输出"Draw",输出时不带引号。 Sample Input 3 5 1 2 2 5 5 2 3 3 1 1 2 Sample Output Miao Wang Draw Hint 第一组数据,五个石头排列为白黑黑黑黑,因此喵星人把前两个石头颠倒顺序可得黑白黑黑黑,此时白色石头位于位置2,因此喵星人获胜。 第二组数据,五个石头排列为黑黑黑黑白,每次可以颠倒任意两个石头的顺序,但是由于这两个石头必须有白色石头存在,因此喵星人只能颠倒最后两个石头,得到黑黑黑白黑,之后由于汪星人选择的是最优走法,因此,汪星人颠倒3~4个石头得到黑黑白黑黑,此时白色石头位于第三个位置,汪星人获胜。 第三组数据,由于只能翻一个石头,又因为一定要包含白色石头,因此每次翻完之后结果是不变的,因此谁也无法获胜,输出Draw。
miao先走,如果存在必胜的局势,那么它现在一步就可以赢,或者说存在某种坑爹的局势(白棋在角落,由于每次移动必须操作白棋的必败局势),那么wang赢,否则的话,两个人完全可以进入死循环(一个人走,另一个人恢复)
所以开始就要判一步能不能赢,模拟一下操作发现对于所有的当前状态m,操作数为k是奇数时,下一个状态不能是m+2*i+1,当操作数是偶数时,下一个状态不能是m+2*i,而且范围在1~n,翻转的地方处理是注意点边界范围
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <cstdio> using namespace std; bool is_ok(int n,int m,int k,int l) { int mi=max(1,m-k+1); mi=mi+k-1-m+mi; int mx=min(n,m+k-1); mx=mx-k+1-m+mx; if(l>=mi && l<=mx && abs(m-l-k)%2 ) return true; return false; } int main() { freopen("H.in","r",stdin); freopen("H.txt","w",stdout); int t; scanf("%d",&t); while(t--) { int m,n,l,k; scanf("%d%d%d%d",&n,&m,&k,&l); if(is_ok(n,m,k,l)) printf("Miao\n"); else { int i; for(i=1;i<=n;i++) { // 从m到i可行,但是从i到l不可行,两人sb死循环 if(is_ok(n,m,k,i)==true&&is_ok(n,i,k,l)==false) { printf("Draw\n"); break; } } if(i==n+1) printf("Wang\n"); } } return 0; }
60 2 1 2 2 3 1 1 2 5 1 2 2 5 5 2 3 5 5 2 2 2 1 1 2 2 2 1 1 2 1 2 2 2 2 2 1 3 1 1 2 3 1 1 3 3 2 1 1 3 2 1 3 3 3 1 1 3 3 1 2 3 1 2 2 3 1 2 3 3 2 2 1 3 2 2 3 3 3 2 1 3 3 2 2 3 1 3 2 3 1 3 3 3 2 3 1 3 2 3 3 3 3 3 1 3 3 3 2 10 1 8 5 9 3 3 9 6 6 4 2 6 1 3 4 8 2 5 7 9 6 8 7 7 6 2 2 10 3 9 10 10 5 10 6 10 4 2 3 8 8 1 6 10 5 9 8 9 8 7 4 10 9 2 10 9 7 3 6 5 3 2 1 9 1 5 6 7 7 3 4 8 3 8 5 10 10 9 5 1000000 131525 705444 275309 1000000 251567 705444 6097 1000000 804588 705444 292263 1000000 791181 347709 721626 1000000 43795 347709 506697 1000000 595477 347709 275837 1000000 157692 569590 680270 1000000 141323 569590 144412 1000000 127671 569590 464318 1000000 418768 623197 388979 1000000 205057 623197 459153 1000000 187669 623197 410751 1000000 279207 267101 658544
Miao
Draw
Miao
Wang
Draw
Draw
Draw
Miao
Miao
Draw
Draw
Draw
Draw
Draw
Draw
Miao
Wang
Miao
Miao
Wang
Miao
Draw
Miao
Draw
Draw
Miao
Draw
Wang
Draw
Wang
Draw
Draw
Draw
Draw
Draw
Miao
Miao
Draw
Draw
Miao
Miao
Draw
Draw
Draw
Draw
Draw
Draw
Wang
Draw
Miao
Draw
Wang
Miao
Wang
Draw
Miao
Draw
Miao
Wang
Draw