提出 #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;
}
}
提出情報
コンパイルエラー
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 |
| 結果 |
|
| セット名 |
テストケース |
| 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 |