結果

問題 No.3131 Twin Slide Puzzles
ユーザー hint908
提出日時 2025-04-25 22:44:48
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 243 ms / 4,000 ms
コード長 4,561 bytes
コンパイル時間 4,488 ms
コンパイル使用メモリ 292,724 KB
実行使用メモリ 31,872 KB
最終ジャッジ日時 2025-06-20 02:47:27
合計ジャッジ時間 18,041 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 59
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘void solve()’:
main.cpp:88:16: warning: ‘pos’ may be used uninitialized [-Wmaybe-uninitialized]
   88 |             ll pos;
      |                ^~~

ソースコード

diff #

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")


#include<bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
template<class T> using V = vector<T>;
template<class T> using VV = V<V<T>>;
template<class T> using VVV = V<VV<T>>;
template<class T> using VVVV = VV<VV<T>>;
#define rep(i,n) for(ll i=0ll;(i)<(n);(i)++)
#define REP(i,a,n) for(ll i=(a);(i)<(n);(i)++)
#define rrep(i,n) for(ll i=(n)-1;(i)>=(0ll);(i)--)
#define RREP(i,a,n) for(ll i=(n)-1;(i)>=(a);(i)--)
const long long INF = (1LL << 60);
const long long mod99 = 998244353;
const long long mod107 = 1000000007;
const long long mod = mod99;
#define eb emplace_back
#define be(v) (v).begin(),(v).end()
#define all(v) (v).begin(),(v).end()
#define foa(i,v) for(auto& (i) : (v))
#define UQ(v) sort(be(v)), (v).erase(unique(be(v)), (v).end())
#define UQ2(v,cmp) sort(be(v)), (v).erase(unique(be(v),cmp), (v).end())
#define UQ3(v,cmp) sort(be(v),cmp), (v).erase(unique(be(v)), (v).end())
#define UQ4(v,cmp,cmp2) sort(be(v), cmp), (v).erase(unique(be(v),cmp2), (v).end())
#define LB(x,v) (lower_bound(be(v),(x))-(v).begin())
#define LB2(x,v,cmp) (lower_bound(be(v),(x),(cmp))-(v).begin())
#define UB(x,v) (upper_bound(be(v),(x))-(v).begin())
#define UB2(x,v,cmp) (upper_bound(be(v),(x),(cmp))-(v).begin())
#define dout()  cout << fixed << setprecision(20)
#define randinit() srand((unsigned)time(NULL))

template<class T, class U> bool chmin(T& t, const U& u) { if (t > u){ t = u; return 1;} return 0; }
template<class T, class U> bool chmax(T& t, const U& u) { if (t < u){ t = u; return 1;} return 0; }


ll Rnd(ll L=0, ll R=mod99){return rand()%(R-L)+L;}


struct BIT {
   vector<ll> a;
   BIT(ll n) : a(n + 1) {}
   void add(ll i, ll x) {  // A[i] += x
      i++;
      while(i < size(a)) {
         a[i] += x;
         i += i & -i;
      }
   }
   ll sum(ll r) {
      ll s = 0;
      while(r) {
         s += a[r];
         r -= r & -r;
      }
      return s;
   }
   ll sum(ll l, ll r) {  // sum of A[l, r)
      return sum(r) - sum(l);
   }
};

void solve(){
    ll n;
    cin >> n;
    V<ll> m(n*n);
    rep(i,n*n) m[i] = Rnd(0, mod);
    rep(i,n*n) cin >> m[i];
    V<ll> v;
    
    ll L = min(15ll, n*n);
    auto score = [&]() -> ll {
        ll ret = 0;
        rep(i, L) ret += v[i] * m[i];
        return ret;
    };
    if(n <= 3){
        rep(i,n*n) v.eb(i);
        map<ll, V<ll>> mp;
        do{
            
            ll pos;
            rep(i, n) rep(j, n) if(v[i*n + j] == 0){
                pos = (i+j)%2;
                break;
            }
            BIT bit(n*n);
            for(auto x:v){
                pos += bit.sum(x, n*n);
                bit.add(x, 1);
            }
            pos %= 2;
            if(pos) continue;
                // if(v[0]*v[1]) swap(v[0], v[1]);
                // else swap(v[n-1], v[n-2]);
            // }
            ll sc = score();
            if(!mp.count(sc) or mp[sc] == v){
                mp[sc] = v;
                continue;
            }
            
            cout << "Yes" << endl;
            auto w = mp[sc];
            rep(i, n) rep(j,n) cout << v[i*n+j] << " \n"[j==n-1];
            rep(i, n) rep(j,n) cout << w[i*n+j] << " \n"[j==n-1];
            return;
        }while(next_permutation(be(v)));
        cout << "No" << endl;
        return;
    }
    L = 15;
    
    rep(i, L) v.eb(n*n-i-1);
    auto vec_shuffle = [&](){
        rep(i, L-1) swap(v[i], v[Rnd(i, L)]);
    };
    ll p = n*(n-1)/2;
    if(p%2) swap(v[0], v[1]);
    map<ll, V<ll>> mp;
    ll sc = score();
    mp[sc] = v;
    
    rep(_, 2000000){
        vec_shuffle();
        ll pos = (n*n-L)*(n*n-L-1)/2 + L*(n*n-L);
        BIT bit(L);
        rep(i, L){
            ll x = v[i] - (n*n-L);
            pos += bit.sum(x, L);
            bit.add(x, 1);
        }
        pos %= 2;
        if(pos) swap(v[0], v[1]);
        ll sc = score();
        if(!mp.count(sc) or mp[sc] == v){
            mp[sc] = v;
            continue;
        }
        
        cout << "Yes" << endl;
        V<ll> w = mp[sc];
        REP(i, L, n*n){
            w.eb(n*n-i-1);
            v.eb(n*n-i-1);
        }
        rep(i, n) rep(j,n) cout << v[i*n+j] << " \n"[j==n-1];
        rep(i, n) rep(j,n) cout << w[i*n+j] << " \n"[j==n-1];
        return;
    }
    cout << "No" << endl;
    
    
    
}





int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int t=1;
    // cin >> t;
    rep(i,t) solve();
}
0