結果
| 問題 | No.655 E869120 and Good Triangles |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-10-26 23:54:21 |
| 言語 | C# (.NET 10.0.402 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 5,709 bytes |
| 記録 | |
| コンパイル時間 | 13,809 ms |
| コンパイル使用メモリ | 172,308 KB |
| 実行使用メモリ | 354,416 KB |
| 最終ジャッジ日時 | 2026-10-26 23:55:11 |
| 合計ジャッジ時間 | 37,881 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge4_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 WA * 4 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (273 ミリ秒)。 main -> /home/judge/data/code/bin/Release/net10.0/main.dll main -> /home/judge/data/code/bin/Release/net10.0/publish/
ソースコード
using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;
class Program
{
static int NN => int.Parse(ReadLine());
static long[] NList => ReadLine().Split().Select(long.Parse).ToArray();
static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray();
static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray();
public static void Main()
{
Solve();
}
static void Solve()
{
var c = NList;
var (n, k, p) = ((int)c[0], (int)c[1], c[2]);
var map = NMap(k);
var INF = int.MaxValue / 2;
var dp = new int[n][];
for (var i = 0; i < n; ++i)
{
dp[i] = new int[i + 1];
for (var j = 0; j <= i; ++j) dp[i][j] = INF;
}
var q = new Queue<(int x, int y)>();
foreach (var pt in map)
{
dp[pt[0]][pt[1]] = 0;
q.Enqueue((pt[0], pt[1]));
}
var mx = new int[] { -1, -1, 0, 0, 1, 1 };
var my = new int[] { -1, 0, -1, 1, 0, 1 };
while (q.Count > 0)
{
var cur = q.Dequeue();
for (var i = 0; i < mx.Length; ++i)
{
var nx = cur.x + mx[i];
var ny = cur.y + my[i];
if (nx < 0 || nx >= n || ny < 0 || ny > nx) continue;
if (dp[nx][ny] <= dp[cur.x][cur.y] + 1) continue;
dp[nx][ny] = dp[cur.x][cur.y] + 1;
q.Enqueue((nx, ny));
}
}
// WriteLine(string.Join("\n", dp.Select(di => string.Join(" ", di))));
var c1 = new long[n]; // 右上
var c2 = new long[n]; // 左上
var c3 = new long[n]; // 下
var c4 = new long[n, n]; // 上
var c5 = new long[n, n]; // 左下
var c6 = new long[n, n]; // 右下
var all = 0L;
for (var i = 0; i < n; ++i) for (var j = 0; j <= i; ++j)
{
c1[i - j] += dp[i][j];
c2[j] += dp[i][j];
c3[n - i - 1] += dp[i][j];
all += dp[i][j];
}
for (var i = 1; i < n; ++i)
{
c1[i] += c1[i - 1];
c2[i] += c2[i - 1];
c3[i] += c3[i - 1];
}
// WriteLine($"c1: {string.Join(" ", c1)}");
// WriteLine($"c2: {string.Join(" ", c2)}");
// WriteLine($"c3: {string.Join(" ", c3)}");
for (var j = 0; j < n; ++j)
{
var sub = 0L;
for (var i = j; i < n; ++i)
{
sub += dp[i][j];
c4[i, j] = sub;
if (j > 0) c4[i, j] += c4[i - 1, j - 1];
}
}
for (var i = n - 1; i >= 0; --i)
{
var sub = 0L;
for (var j = 0; j <= i; ++j)
{
sub += dp[i][j];
c5[i, j] = sub;
if (i < n - 1) c5[i, j] += c5[i + 1, j];
}
}
for (var i = n - 1; i >= 0; --i)
{
var sub = 0L;
for (var j = i; j >= 0; --j)
{
sub += dp[i][j];
c6[i, j] = sub;
if (i < n - 1) c6[i, j] += c6[i + 1, j + 1];
}
}
var ans = 0L;
for (var i = 0; i < n; ++i) for (var j = 0; j <= i; ++j)
{
// WriteLine($"i = {i}, j = {j}");
if (dp[i][j] >= p)
{
// WriteLine($" A: 0 to {n-i-1}");
ans += n - i - 1;
}
else
{
var max = Calc(n, i, j, n - i - 1, all, c1, c2, c3, c4, c5, c6);
if (max >= p)
{
var ok = n - i - 1;
var ng = 0;
while (ok - ng > 1)
{
var mid = (ok + ng) / 2;
var tmp = Calc(n, i, j, mid, all, c1, c2, c3, c4, c5, c6);
if (tmp >= p) ok = mid;
else ng = mid;
}
ans += n - i - ok;
// WriteLine($" B: {ok} to {n-i-1} ({n-i-ok})");
}
// else WriteLine($" C");
}
}
WriteLine(ans);
}
static long Calc(int n, int i, int j, int len, long all, long[] c1, long[] c2, long[] c3, long[,] c4, long[,] c5, long[,] c6)
{
// Write($"i={i}, j={j}, len={len}");
var dx = i + len;
var ly = j;
var ry = j + len;
var ans = all;
if (i > j)
{
ans -= c1[i - j - 1];
// Write($" -c1 {c1[i-j-1]}");
}
if (j > 0)
{
ans -= c2[j - 1];
// Write($" -c2 {c2[j - 1]}");
}
if (dx + 1 < n)
{
ans -= c3[n - 2 - dx];
// Write($" -c3 {c3[n-2-dx]}");
}
var x4 = i - 2;
var y4 = j - 1;
if (x4 >= 0 && y4 >= 0)
{
ans += c4[x4, y4];
// Write($" +c4 {c4[x4, y4]}");
}
var x5 = dx + 1;
var y5 = ly - 1;
if (x5 < n && y5 >= 0)
{
ans += c5[x5, y5];
// Write($" +c5 {c5[x5, y5]}");
}
var x6 = dx + 1;
var y6 = ry + 2;
if (x6 < n && y6 <= x6)
{
ans += c6[x6, y6];
// Write($" +c6 {c6[x6, y6]}");
}
// WriteLine($" = {ans}");
return ans;
}
}