提出 #69509878


ソースコード 拡げる

// AHC054
// 良い初期解
// 次の進路を妨害する
// 96, 3480, 59906
// ゴールを入口が内側に向くように囲む
// 94, 7374, 100256
// // 進路を3つ先まで妨害する
// // 376, 6810, 56772
// ゴールを入口が外側に向くように囲む
// 44, 1462, 121180
// // 進路妨害を3マス前に変更
// // 56, 1050, 89452
// ふさがなくていい場所をふさがないように変更
// 42, 2902, 127114
// // 進路妨害をゴール側に行かないように変更
// // 100, 3176, 63798
// カタツムリ状に配置
// 1078, 1106,
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
using ll = long long;
using ull = unsigned long long;
#define TIME_LIMIT_MS 1950
#define TEMP_MAX 100000
#define TEMP_MIN 0
#define SUBMIT

random_device seed_gen;
mt19937_64 rng(seed_gen());
uniform_real_distribution<> real_dist(0.0, 1.0);

bool time_check(chrono::high_resolution_clock::time_point start, int limit_ms);

double temp_func(double temp_max, double temp_min, chrono::high_resolution_clock::time_point start, int limit_ms);

// スコアが下がる方向への焼きなまし
double prob_func(ll prev_score, ll crr_score, double temp);

// 入力
int N;
int ti, tj;
vector<vector<char>> b;

// 答え

// それ以外
vector<vector<bool>> rev; // 確認済みか

chrono::high_resolution_clock::time_point start_time;

void input();

int calc_score();

// 座標が有効か
bool valid_coord(int x, int y);

// たどり着けるマスの数
// 大きいほうが良い
// 花にたどり着けないなら0
// 0 ~ N^2
int bfs_score(int pi, int pj);

#ifdef SUBMIT
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    start_time = chrono::high_resolution_clock::now();

    input();

    bool first_flag = true;

    while (1)
    {
        int pi, pj;
        cin >> pi >> pj;
        int n;
        cin >> n;
        rep(i, n)
        {
            int x, y;
            cin >> x >> y;
            rev[x][y] = true;
        }

        if (pi == ti && pj == tj)
        {
            break;
        }

        // トレント配置

        int m = 0;
        vector<int> xt;
        vector<int> yt;

        // 全てのマスをシャッフル
        // O(N^2)
        vector<pair<int, int>> cand;
        cand.reserve(N * N);

        // // ゴールの四方を囲む
        // if(first_flag){
        //     first_flag = false;
        //     priority_queue<
        //         pair<int,pair<int,int>>,
        //         vector<pair<int,pair<int,int>>>,
        //         greater<pair<int,pair<int,int>>>
        //     > pq;
        //     pq.push({abs(ti - N / 2) + abs(tj - N),     {ti,tj-1}}); // 右
        //     pq.push({abs(ti - N / 2) + abs(tj),         {ti,tj+1}}); // 左
        //     pq.push({abs(ti)         + abs(tj - N / 2), {ti+1,tj}}); // 上
        //     pq.push({abs(ti - N)     + abs(tj - N / 2), {ti-1,tj}}); // 下
        //     while(!pq.empty()){
        //         cand.push_back(pq.top().second);
        //         pq.pop();
        //     }
        // }

        // ゴールをカタツムリ状に囲む
        if(first_flag){
            first_flag = false;
            vector<int> di = {-1, 0, 0, 1, 2, 2, 2, 1, 0,-1,-2,-3,-3,-3,-2};
            vector<int> dj = { 0, 1,-1, 1, 0,-1,-2,-3,-3,-3,-2,-1, 0, 1, 2};
            rep(i,di.size()){
                cand.push_back({ti + di[i], tj + dj[i]});
            }
        }

        // 進路妨害
        priority_queue<pair<int,pair<int,int>>> pq;
        vector<int> dirx = {0, 1, 0, -1};
        vector<int> diry = {1, 0, -1, 0};
        rep(i,4){
            int ni = pi + 2*dirx[i];
            int nj = pj + 2*diry[i];
            if(valid_coord(pi+dirx[i],pj+diry[i]) && b[pi+dirx[i]][pj+diry[i]] == 'T')continue;
            cand.push_back({ni,nj});
            // pq.push({N * N - min(abs(ni - ti) + abs(nj - tj), 10), {ni,nj}});
            // pq.push({N * N - min(min(abs(ni - ti), abs(nj - tj)), 5), {ni,nj}});
        }
        rep(i,4){
            int ni = pi + dirx[i];
            int nj = pj + diry[i];
            if(valid_coord(pi+dirx[i],pj+diry[i]) && b[pi+dirx[i]][pj+diry[i]] == 'T')continue;
            for(int j=1;j<4;j++){
                int ni2 = ni + dirx[(i+j) % 4];
                int nj2 = nj + diry[(i+j) % 4];
                cand.push_back({ni2,nj2});
                // pq.push({- min(abs(ni2 - ti) + abs(nj2 - tj), 10), {ni2,nj2}});
                // pq.push({- min(min(abs(ni2 - ti), abs(nj2 - tj)), 5), {ni2,nj2}});
            }
        }
        while(!pq.empty()){
            cand.push_back(pq.top().second);
            pq.pop();
        }

        // 順に配置できるかチェック
        // O(cand.size())
        rep(i, cand.size())
        {
            auto [xc, yc] = cand[i];

            // 有効な座標か
            if (xc < 0 || xc >= N || yc < 0 || yc >= N)
            {
                continue;
            }

            // 空きマスか
            if (b[xc][yc] == 'T' || (ti == xc && tj == yc))
            {
                continue;
            }

            // 未確認か
            if (rev[xc][yc])
                continue;

            int before = bfs_score(pi,pj);

            // 木として配置
            b[xc][yc] = 'T';

            // ゴールがふさがらないか
            // たどり着けるマスが減らないか
            // bfs
            // O(N^2)
            int after = bfs_score(pi,pj);
            if(before - after > 0){
                // ダメなら戻して次へ
                b[xc][yc] = '.';
                continue;
            }

            m++;
            xt.push_back(xc);
            yt.push_back(yc);
        }

        // 出力
        // O(N^2)
        cout << m;
        rep(i, m)
        {
            cout << " " << xt[i] << " " << yt[i];
        }
        cout << '\n';
        cout.flush();
    }
}
#else
int main()
{
}
#endif

/////////////////////////////////

bool time_check(chrono::high_resolution_clock::time_point start, int limit_ms)
{
    auto now = chrono::high_resolution_clock::now();
    auto diff = now - start;
    auto diff_ms = chrono::duration_cast<chrono::milliseconds>(diff).count();
    if (diff_ms < limit_ms)
    {
        return true;
    }
    else
    {
        return false;
    }
}

double temp_func(double temp_max, double temp_min, chrono::high_resolution_clock::time_point start, int limit_ms)
{
    auto now = chrono::high_resolution_clock::now();
    auto diff = now - start;
    auto diff_ms = chrono::duration_cast<chrono::milliseconds>(diff).count();
    double r = (double)diff_ms / (double)limit_ms;
    return temp_max - ((temp_max - temp_min) * r);
}

// スコアが下がる方向への焼きなまし
double prob_func(ll prev_score, ll crr_score, double temp)
{
    return exp((((double)prev_score) - ((double)crr_score)) / temp);
}

////////////

void input()
{
    cin >> N >> ti >> tj;
    b.assign(N, vector<char>(N));
    rep(i, N)
    {
        rep(j, N)
        {
            cin >> b[i][j];
        }
    }
    rev.assign(N, vector<bool>(N, false));
}

/////////////

int calc_score()
{
    return 0;
}

// 座標が有効か
bool valid_coord(int x, int y){
    if (x < 0 || x >= N || y < 0 || y >= N)
    {
        return false;
    }else{
        return true;
    }
}

// たどり着けるマスの数
// 大きいほうが良い
// 花にたどり着けないなら0
// 0 ~ N^2
int bfs_score(int pi, int pj){
    bool ok = false;
    int c = 0;
    queue<pair<int, int>> q;
    vector<int> dirx = {-1, 1, 0, 0};
    vector<int> diry = {0, 0, -1, 1};
    vector<vector<bool>> seen(N, vector<bool>(N, false));
    q.push({pi, pj});
    seen[pi][pj] = true;
    c++;
    while (!q.empty())
    {
        auto [xb, yb] = q.front();
        q.pop();

        rep(j, 4)
        {
            int xn = xb + dirx[j];
            int yn = yb + diry[j];
            if (xn < 0 || N <= xn)
                continue;
            if (yn < 0 || N <= yn)
                continue;
            if (seen[xn][yn])
                continue;
            seen[xn][yn] = true;
            c++;
            if (b[xn][yn] == 'T')
                continue;
            if (xn == ti && yn == tj)
            {
                ok = true;
                continue;
            }
            q.push({xn, yn});
        }
    }
    if(ok){
        return c;
    }else{
        return 0;
    }
}

提出情報

提出日時
問題 A - Treant's Forest
ユーザ sh_unnnn_taro
言語 C++ 23 (gcc 12.2)
得点 203932
コード長 8809 Byte
結果 AC
実行時間 100 ms
メモリ 3668 KiB

コンパイルエラー

Main.cpp: In function ‘int main()’:
Main.cpp:21:37: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   21 | #define rep(i, n) for (int i = 0; i < n; i++)
      |                                     ^
Main.cpp:129:13: note: in expansion of macro ‘rep’
  129 |             rep(i,di.size()){
      |             ^~~
Main.cpp:21:37: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   21 | #define rep(i, n) for (int i = 0; i < n; i++)
      |                                     ^
Main.cpp:165:9: note: in expansion of macro ‘rep’
  165 |         rep(i, cand.size())
      |         ^~~

ジャッジ結果

セット名 test_ALL
得点 / 配点 203932 / 100000000000
結果
AC × 100
セット名 テストケース
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt
ケース名 結果 実行時間 メモリ
test_0000.txt AC 7 ms 3520 KiB
test_0001.txt AC 10 ms 3472 KiB
test_0002.txt AC 7 ms 3464 KiB
test_0003.txt AC 13 ms 3532 KiB
test_0004.txt AC 21 ms 3548 KiB
test_0005.txt AC 44 ms 3536 KiB
test_0006.txt AC 30 ms 3488 KiB
test_0007.txt AC 9 ms 3396 KiB
test_0008.txt AC 47 ms 3400 KiB
test_0009.txt AC 11 ms 3576 KiB
test_0010.txt AC 15 ms 3468 KiB
test_0011.txt AC 8 ms 3400 KiB
test_0012.txt AC 100 ms 3408 KiB
test_0013.txt AC 38 ms 3660 KiB
test_0014.txt AC 39 ms 3468 KiB
test_0015.txt AC 18 ms 3504 KiB
test_0016.txt AC 22 ms 3648 KiB
test_0017.txt AC 41 ms 3540 KiB
test_0018.txt AC 47 ms 3524 KiB
test_0019.txt AC 47 ms 3500 KiB
test_0020.txt AC 48 ms 3536 KiB
test_0021.txt AC 12 ms 3424 KiB
test_0022.txt AC 9 ms 3652 KiB
test_0023.txt AC 8 ms 3580 KiB
test_0024.txt AC 17 ms 3584 KiB
test_0025.txt AC 7 ms 3492 KiB
test_0026.txt AC 38 ms 3496 KiB
test_0027.txt AC 49 ms 3668 KiB
test_0028.txt AC 13 ms 3536 KiB
test_0029.txt AC 12 ms 3532 KiB
test_0030.txt AC 7 ms 3472 KiB
test_0031.txt AC 21 ms 3524 KiB
test_0032.txt AC 68 ms 3456 KiB
test_0033.txt AC 11 ms 3572 KiB
test_0034.txt AC 13 ms 3524 KiB
test_0035.txt AC 80 ms 3588 KiB
test_0036.txt AC 13 ms 3528 KiB
test_0037.txt AC 17 ms 3652 KiB
test_0038.txt AC 14 ms 3532 KiB
test_0039.txt AC 10 ms 3528 KiB
test_0040.txt AC 11 ms 3472 KiB
test_0041.txt AC 12 ms 3464 KiB
test_0042.txt AC 8 ms 3652 KiB
test_0043.txt AC 22 ms 3536 KiB
test_0044.txt AC 34 ms 3408 KiB
test_0045.txt AC 100 ms 3500 KiB
test_0046.txt AC 11 ms 3472 KiB
test_0047.txt AC 57 ms 3544 KiB
test_0048.txt AC 79 ms 3536 KiB
test_0049.txt AC 29 ms 3660 KiB
test_0050.txt AC 14 ms 3464 KiB
test_0051.txt AC 24 ms 3532 KiB
test_0052.txt AC 4 ms 3520 KiB
test_0053.txt AC 7 ms 3656 KiB
test_0054.txt AC 37 ms 3468 KiB
test_0055.txt AC 12 ms 3520 KiB
test_0056.txt AC 14 ms 3496 KiB
test_0057.txt AC 31 ms 3560 KiB
test_0058.txt AC 5 ms 3576 KiB
test_0059.txt AC 60 ms 3496 KiB
test_0060.txt AC 48 ms 3404 KiB
test_0061.txt AC 47 ms 3492 KiB
test_0062.txt AC 65 ms 3532 KiB
test_0063.txt AC 12 ms 3496 KiB
test_0064.txt AC 36 ms 3472 KiB
test_0065.txt AC 77 ms 3540 KiB
test_0066.txt AC 98 ms 3564 KiB
test_0067.txt AC 6 ms 3476 KiB
test_0068.txt AC 35 ms 3660 KiB
test_0069.txt AC 11 ms 3660 KiB
test_0070.txt AC 28 ms 3652 KiB
test_0071.txt AC 10 ms 3580 KiB
test_0072.txt AC 15 ms 3664 KiB
test_0073.txt AC 51 ms 3548 KiB
test_0074.txt AC 32 ms 3468 KiB
test_0075.txt AC 10 ms 3648 KiB
test_0076.txt AC 4 ms 3568 KiB
test_0077.txt AC 12 ms 3400 KiB
test_0078.txt AC 54 ms 3400 KiB
test_0079.txt AC 27 ms 3480 KiB
test_0080.txt AC 18 ms 3520 KiB
test_0081.txt AC 3 ms 3536 KiB
test_0082.txt AC 69 ms 3648 KiB
test_0083.txt AC 6 ms 3576 KiB
test_0084.txt AC 38 ms 3476 KiB
test_0085.txt AC 11 ms 3556 KiB
test_0086.txt AC 18 ms 3528 KiB
test_0087.txt AC 79 ms 3524 KiB
test_0088.txt AC 3 ms 3472 KiB
test_0089.txt AC 8 ms 3552 KiB
test_0090.txt AC 13 ms 3652 KiB
test_0091.txt AC 17 ms 3648 KiB
test_0092.txt AC 17 ms 3580 KiB
test_0093.txt AC 67 ms 3668 KiB
test_0094.txt AC 19 ms 3652 KiB
test_0095.txt AC 27 ms 3468 KiB
test_0096.txt AC 36 ms 3536 KiB
test_0097.txt AC 19 ms 3532 KiB
test_0098.txt AC 21 ms 3552 KiB
test_0099.txt AC 4 ms 3528 KiB