最開始猜了個結論錯了,猜的是必須要有\(m+n-1\)個方格空著,這樣才能保證任意一張牌能從起點到終點。
其實並不是,參考數字華容道,實際上是隻要除了終點和起點,以及自身這個方格。我們只需要留出一個空格就可以使任意方格移動到任意位置。
我們只需要統計一下,一個數前面比他小的數有多少個,然後取個最大值,就是最大的要使這個牌按順序到達終點,其它牌不能到達終點的情況,這時應該時滿足\(m * n-4>=mx\)所有的就都可以滿足。
#include <bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define fep(i, a, b) for(int i = (a); i >= (b); --i)
#define _for(i, a, b) for(int i=(a); i<(b); ++i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define fs first
#define sc second
#define pb push_back
#define vi vector<int>
using namespace std;
const int maxn = 1e6 + 10;
int a[maxn],tr[maxn],n,m,k;
int lowbit(int x){
return x&-x;
}
void add(int x, int d){
for(int i=x;i<=k;i+=lowbit(i)){
tr[i]+=d;
}
}
int ask(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)){
res+=tr[i];
}
return res;
}
void solve() {
cin>>n>>m>>k;
rep(i,1,k){
tr[i]=0;
}
rep(i,1,k){
cin>>a[i];
}
int res=0;
rep(i,1,k){
res=max(res,ask(a[i]));
add(a[i],1);
}
if(n*m-4>=res){
cout<<"YA\n";
}else{
cout<<"TIDAK\n";
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen("C:\\Users\\24283\\CLionProjects\\untitled2\\1.in", "r", stdin);
int _;
cin >> _;
while (_--)
solve();
return 0;
}
``