結果

問題 No.5024 魔法少女うなと宝集め
コンテスト
ユーザー takahashihiroto0705-hub
提出日時 2026-05-02 18:06:54
言語 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
結果
RE  
実行時間 -
コード長 5,157 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 3,434 ms
コンパイル使用メモリ 375,688 KB
実行使用メモリ 6,400 KB
スコア 1,806,650
最終ジャッジ日時 2026-05-02 18:07:29
合計ジャッジ時間 20,202 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 47 RE * 3
権限があれば一括ダウンロードができます

ソースコード

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=20000;
    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()>150){
                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=0;
        turn=30;
        while(turn--){
            ll l=(L-6)*dist(engine);
            ll r=l+6;
            if(V[l].fi==V[r].fi) continue;
            if(V[l].se==V[r].se) continue;
            ll sx=V[l].fi,sy=V[l].se;
            ll cnt_now=0;
            rep(i,5) cnt_now+=A[V[l+1+i].fi][V[l+1+i].se]; 
            rep(bit,1024){
                ll x=sx,y=sy;
                ll BIT=bit;
                bool ok=false;
                ll cnt_tmp=0;
                vector<pair<ll,ll>> tmp; 
                set<pair<ll,ll>> s_tmp;
                rep(i,5){
                    ll k=BIT%4;
                    BIT/=4;
                    ll ni=x+dx[k];
                    ll nj=y+dy[k];
                    if(ni<0||N<=ni) break;
                    if(nj<0||N<=nj) break;
                    if(used[ni][nj]) break;
                    x=ni,y=nj;
                    cnt_tmp+=A[x][y];
                    tmp.push_back({x,y});
                    s_tmp.insert({x,y});
                    if(i==4){
                        if(abs(x-V[r].fi)+abs(y-V[r].se)==1){
                            ok=true;
                        }
                        if((ll)s.size()!=5){
                            ok=false;
                        }
                    }
                }
                if(ok&&cnt_tmp>=cnt_now){
                    cnt+=cnt_tmp-cnt_now;
                    rep(i,5) used[V[l+1+i].fi][V[l+1+i].se]=false;
                    rep(i,5) V[l+1+i]=tmp[i];
                    rep(i,5) used[V[l+1+i].fi][V[l+1+i].se]=true;
                }
                if(cnt>ans){
                    ans=cnt;
                    ANS=V;
                }
            }
        }
        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