【POJ2893&HDOJ6620】M × N Puzzle(n*m数码判定)

题意:给定一个n*m的矩阵,其中不重复地填【0,n*m-1】,问是否能通过有限步数将0移到右下角

n,m<=1e3

思路:结论题 当板子了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef unsigned int uint;
 5 typedef unsigned long long ull;
 6 typedef pair<int,int> PII;
 7 typedef pair<ll,ll> Pll;
 8 typedef vector<int> VI;
 9 typedef vector<PII> VII;
10 //typedef pair<ll,ll>P;
11 #define N  1000010
12 #define M  200010
13 #define fi first
14 #define se second
15 #define MP make_pair
16 #define pb push_back
17 #define pi acos(-1)
18 #define mem(a,b) memset(a,b,sizeof(a))
19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
21 #define lowbit(x) x&(-x)
22 #define Rand (rand()*(1<<16)+rand())
23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
24 #define ls p<<1
25 #define rs p<<1|1
26 
27 const int MOD=1e9+7,inv2=(MOD+1)/2;
28       double eps=1e-4;
29       int INF=1e9;
30       int inf=0x7fffffff;
31       int dx[4]={-1,1,0,0};
32       int dy[4]={0,0,-1,1};
33 
34       int t[N],mx;
35 
36 int read()
37 {
38    int v=0,f=1;
39    char c=getchar();
40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
42    return v*f;
43 }
44 
45 int query(int x)
46 {
47     int res=0;
48     while(x<=mx)
49     {
50         res^=t[x];
51         x+=lowbit(x);
52     }
53     return res;
54 }
55 
56 void add(int x)
57 {
58     while(x)
59     {
60         t[x]^=1;
61         x-=lowbit(x);
62     }
63 }
64 
65 int main()
66 {
67     int n,m;
68     while(scanf("%d%d",&n,&m)!=EOF)
69     {
70         if(!n) break;
71         mx=n*m;
72         rep(i,1,mx) t[i]=0;
73         int s=0,ans=0,k=0;
74         rep(i,1,n)
75          rep(j,1,m)
76          {
77              s++;
78              int x=read();
79              if(!x) k=n-i;
80               else
81               {
82                   ans^=query(x);
83                   add(x);
84               }
85          }
86         if(m&1) k=0;
87         if((ans+k)%2==0) printf("Yes
");
88          else printf("No
");
89     }
90     return 0;
91 }
原文地址:https://www.cnblogs.com/myx12345/p/11644397.html