結果
| 問題 | No.861 ケーキカット |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-06-21 22:19:54 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,158 bytes |
| 記録 | |
| コンパイル時間 | 2,772 ms |
| コンパイル使用メモリ | 346,596 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-06-21 22:20:08 |
| 合計ジャッジ時間 | 5,423 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 3 WA * 18 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define pii pair<int, int>
#define piii pair<pii, int>
#define pll pair<ll, ll>
#define plll pair<pll, ll>
#define fi first
#define se second
const int N = 2e5 + 5, M = 1e6 + 5;
const int inf = 1e9, mod = 998244353;
const ll INF = 1e18;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
namespace ARIS0_0{
int a[10][10], id[10][10];
void init(){
}
void solve(){
int n = 5, all = 0;
for (int i = 1; i <= 5; i ++ )
for (int j = 1; j <= 5; j ++ )
cin >> a[i][j], all += a[i][j];
for (int i = 1, t = 1; i <= 5; i ++ )
for (int j = 1; j <= 5; j ++, t ++ )
id[i][j] = t;
int ans = INF;
for (int I = 0; I < 16; I ++ )
for (int J = I; J < 16; J ++ ){
int sx, sy, ex, ey;
{
int a = I / 4, b = I % 4;
if (a == 0) sx = 1, sy = b + 1;
else if (a == 1) sx = b + 1, sy = n;
else if (a == 2) sx = n, sy = n - b;
else if (a == 3) sx = n - b, sy = 1;
}
{
int a = J / 4, b = J % 4;
if (a == 0) ex = 1, ey = b;
else if (a == 1) ex = b, ey = n;
else if (a == 2) ex = n, ey = n - b + 1;
else if (a == 3) ex = n - b + 1, ey = 1;
}
int sa = 0;
vector <vector <int>> vis(6, vector <int> (6));
if (I / 4 == J / 4){
int aa = I / 4;
if (aa == 0){
for (int j = sy; j <= ey; j ++ ) sa += a[1][j], vis[1][j] = 1;
}
else if (aa == 1){
for (int j = sx; j <= ex; j ++ ) sa += a[j][n], vis[j][n] = 1;
}
else if (aa == 2){
for (int j = sy; j >= ey; j -- ) sa += a[n][j], vis[n][j] = 1;
}
else{
for (int j = sx; j >= ex; j -- ) sa += a[j][1], vis[j][1] = 1;
}
}
else{
{
int aa = I / 4, b = I % 4;
if (aa == 0){
for (int j = sy; j <= n; j ++ ) sa += a[1][j], vis[1][j] = 1;
}
else if (aa == 1){
for (int j = sx; j <= n; j ++ ) sa += a[j][n], vis[j][n] = 1;
}
else if (aa == 2){
for (int j = sy; j >= 1; j -- ) sa += a[n][j], vis[n][j] = 1;
}
else if (aa == 3){
for (int j = sx; j >= 1; j -- ) sa += a[j][1], vis[j][1] = 1;
}
}
{
int aa = J / 4, b = J % 4;
if (aa == 0){
for (int j = 1; j <= sy; j ++ ) sa += a[1][j], vis[1][j] = 1;
}
else if (aa == 1){
for (int j = 1; j <= sx; j ++ ) sa += a[j][n], vis[j][n] = 1;
}
else if (aa == 2){
for (int j = n; j >= sy; j -- ) sa += a[n][j], vis[n][j] = 1;
}
else if (aa == 3){
for (int j = n; j >= sx; j -- ) sa += a[j][1], vis[j][1] = 1;
}
}
for (int aa = I / 4 + 1; aa < J / 4; aa ++ ){
if (aa == 0){
for (int j = 1; j <= n; j ++ ) if (!vis[1][j]) sa += a[1][j], vis[1][j] = 1;
}
else if (aa == 1){
for (int j = 1; j <= n; j ++ ) if (!vis[j][n]) sa += a[j][n], vis[j][n] = 1;
}
else if (aa == 2){
for (int j = n; j >= 1; j -- ) if (!vis[n][j]) sa += a[n][j], vis[n][j] = 1;
}
else if (aa == 3){
for (int j = n; j >= 1; j -- ) if (!vis[j][1]) sa += a[j][1], vis[j][1] = 1;
}
}
}
for (int m = 0; m < (1 << 9); m ++ ){
for (int j = 0; j < 9; j ++ )
if (((m >> j) & 1)){
int x = j / 3, y = j % 3;
x ++, y ++;
vis[x][y] = 1;
}
int cnt1 = 0;
queue <pii> q;
q.push({sx, sy});
vector <vector <int>> qwq(6, vector <int> (6));
while (q.size()){
int x = q.front().fi, y = q.front().se; q.pop();
if (qwq[x][y]) continue;
qwq[x][y] = 1, cnt1 ++ ;
for (int u = 0; u < 4; u ++ ){
int nx = x + dx[u], ny = y + dy[u];
if (nx < 1 || nx >n || ny < 1 || ny > n) continue;
if (vis[nx][ny]) q.push({nx, ny});
}
}
int cnt2 = 0;
while (q.size()) q.pop();
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= n; j ++ ){
if (!vis[i][j] && !q.size())
q.push({i, j});
qwq[i][j] = false;
}
while (q.size()){
int x = q.front().fi, y = q.front().se; q.pop();
if (qwq[x][y]) continue;
qwq[x][y] = 1, cnt2 ++ ;
for (int u = 0; u < 4; u ++ ){
int nx = x + dx[u], ny = y + dy[u];
if (nx < 1 || nx >n || ny < 1 || ny > n) continue;
if (!vis[nx][ny]) q.push({nx, ny});
}
}
if (cnt1 + cnt2 == 25){
int x = abs(sa - (all - sa));
ans = min(ans, x);
}
}
}
cout << ans << "\n";
}
void single(){ init(), solve(); }
void multi(){ init(); int T; cin >> T; while (T -- ) solve(); }
void idmulti(){ init(); int id, T; cin >> id >> T; while (T -- ) solve(); }
};
signed main(){
// freopen("cake.in", "r", stdin);
// freopen("cake.out", "w", stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ARIS0_0::single();
}
/*
注意到最外圈有两个或零个切口
枚举这两个,假设中间某一段是 A,另一段是 B
然后向中间扩张
中间只有 3*3!!!
于是可以 2^9 枚举!!!
然后判断联通即可!
联通!
fish_love_dsu!!!
靠怎么变量名重名了,i -> I, j -> J 得了
*/