結果
| 問題 | No.743 Segments on a Polygon |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-10-08 09:18:55 |
| 言語 | C# (.NET 10.0.400 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 461 ms / 2,000 ms |
| + 389µs | |
| コード長 | 3,206 bytes |
| 記録 | |
| コンパイル時間 | 7,149 ms |
| コンパイル使用メモリ | 172,704 KB |
| 実行使用メモリ | 85,716 KB |
| 最終ジャッジ日時 | 2026-10-08 09:19:12 |
| 合計ジャッジ時間 | 13,569 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge4_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (171 ミリ秒)。 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 int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
public static void Main()
{
Solve();
}
static void Solve()
{
var c = NList;
var (n, m) = (c[0], c[1]);
var map = NArr(n);
WriteLine(Seg(n, m, map));
}
static long Seg(int n, int m, int[][] map)
{
for (var i = 0; i < n; ++i) if (map[i][0] > map[i][1]) (map[i][0], map[i][1]) = (map[i][1], map[i][0]);
Array.Sort(map, (l, r) => l[0].CompareTo(r[0]));
var set = new HashSet<int>();
foreach (var edge in map)
{
set.Add(edge[0]);
set.Add(edge[1]);
}
var slist = new List<int>(set);
slist.Sort();
var dic = new Dictionary<int, int>();
for (var i = 0; i < slist.Count; ++i) dic[slist[i]] = i;
var p = new int[n * 2];
var div = 400;
var dlist = new List<List<(int id, int a, int b)>>();
for (var i = 0; i < n; i += div)
{
var list = new List<(int id, int a, int b)>();
for (var j = 0; j < div && i + j < n; ++j)
{
var a = dic[map[i + j][0]];
var b = dic[map[i + j][1]];
p[a] = i + j;
p[b] = i + j;
list.Add((i + j, Math.Min(a, b), Math.Max(a, b)));
}
if (i / div % 2 == 0) list.Sort((l, r) => l.b.CompareTo(r.b));
else list.Sort((l, r) => r.b.CompareTo(l.b));
dlist.Add(list);
}
var dp = new bool[n];
var count = 0;
var pa = 0;
var pb = 0;
var ans = 0L;
var change = 0L;
foreach (var dli in dlist)
{
foreach (var li in dli)
{
while (pb < li.b + 1)
{
dp[p[pb]] = !dp[p[pb]];
if (dp[p[pb]]) ++count;
else --count;
++pb;
++change;
}
while (li.a < pa)
{
--pa;
dp[p[pa]] = !dp[p[pa]];
if (dp[p[pa]]) ++count;
else --count;
++change;
}
while (pa < li.a)
{
dp[p[pa]] = !dp[p[pa]];
if (dp[p[pa]]) ++count;
else --count;
++pa;
++change;
}
while (li.b + 1 < pb)
{
--pb;
dp[p[pb]] = !dp[p[pb]];
if (dp[p[pb]]) ++count;
else --count;
++change;
}
ans += count;
}
}
return ans / 2;
}
}