题意:给定一个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 }