結果

問題 No.5024 魔法少女うなと宝集め
コンテスト
ユーザー takahashihiroto0705-hub
提出日時 2026-05-02 17:45:09
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 89 ms / 2,000 ms
コード長 3,454 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 4,396 ms
コンパイル使用メモリ 369,592 KB
実行使用メモリ 6,400 KB
スコア 1,777,600
最終ジャッジ日時 2026-05-02 17:45:24
合計ジャッジ時間 11,586 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_0
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 50
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
const ll mod = 998244353;
#define fi first
#define se second
#define rep(i,N) for(ll i=0;i<N;i++)
#define all(A) A.begin(),A.end()
#define faster ios::sync_with_stdio(false);cin.tie(nullptr)

const vector<ll> dx={0,1,0,-1};
const vector<ll> dy={1,0,-1,0};

int main() {
    random_device seed_gen;
    mt19937 engine(seed_gen());
    uniform_real_distribution<float> dist(0,1);
    ll N,T;
    cin >> N >> T;
    vector<vector<ll>> A(N,vector<ll>(N));
    vector<vector<ll>> B(N,vector<ll>(N));
    ll SUM=0;
    rep(i,N) rep(j,N) cin >> A[i][j],B[i][j]=A[i][j]*(50-abs(2*i-19)-abs(2*j-19)),SUM+=B[i][j];
    vector<pair<ll,ll>> ANS;
    ll ans=0;
    set<pair<ll,pair<vector<pair<ll,ll>>,vector<vector<bool>>>>> s;
    ll Q=10000;
    rep(I,N) rep(J,N){
        ll q=(Q*B[I][J])/SUM;
        while(q--){
            vector<pair<ll,ll>> CNT;
            ll cnt=A[I][J];
            ll i=I,j=J;
            CNT.push_back({i,j});
            vector<vector<bool>> used(N,vector<bool>(N,false));
            used[i][j]=true;
            while((ll)CNT.size()<T){
                vector<pair<ll,ll>> V;
                ll sum=0;
                rep(k,4){
                    ll ni=i+dx[k];
                    ll nj=j+dy[k];
                    if(ni<0||N<=ni) continue;
                    if(nj<0||N<=nj) continue;
                    if(used[ni][nj]) continue;
                    V.push_back({k,B[ni][nj]});
                    sum+=B[ni][nj];
                }
                if((ll)V.size()==0){
                    break;
                }
                ll X=sum*dist(engine);
                rep(k,(ll)V.size()){
                    X-=V[k].se;
                    if(X<0){
                        i+=dx[V[k].fi];
                        j+=dy[V[k].fi];
                        used[i][j]=true;
                        cnt+=A[i][j];
                        CNT.push_back({i,j});
                        break;
                    }
                    if(k+1==(ll)V.size()){
                        cout << "Error" << endl;
                    }
                }
            }
            if(cnt>ans){
                ans=cnt;
                ANS=CNT;
            }
            s.insert({cnt,{CNT,used}});
            if((ll)s.size()>100){
                s.erase(*s.begin());
            }
        }
    }
    auto it=s.begin();
    while(it!=s.end()){
        vector<pair<ll,ll>> V=(*it).se.fi;
        vector<vector<bool>> used=(*it).se.se;
        ll cnt=(*it).fi;
        ll L=V.size();
        ll turn=1000;
        while(turn--){
            ll l=(L-2)*dist(engine);
            ll r=l+2;
            if(V[l].fi==V[r].fi) continue;
            if(V[l].se==V[r].se) continue;
            ll x=V[l+1].fi,y=V[l+1].se;
            ll xx=V[l].fi+V[r].fi-x,yy=V[l].se+V[r].se-y;
            if(used[xx][yy]) continue;
            if(A[x][y]<A[xx][yy]){
                V[l+1].fi=xx;
                V[l+1].se=yy;
                cnt+=A[xx][yy]-A[x][y];
                used[x][y]=false;
                used[xx][yy]=true;
            }
            if(cnt>ans){
                ans=cnt;
                ANS=V;
            }
        }
        it++;
    }
    cout << ANS.size() << endl;
    rep(i,(ll)ANS.size()){
        cout << ANS[i].fi << " " << ANS[i].se << endl;
    }
    return 0;
}
0