結果
| 問題 |
No.3100 Parallel Translated
|
| コンテスト | |
| ユーザー |
ks2m
|
| 提出日時 | 2025-04-11 21:43:48 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 134 ms / 2,000 ms |
| コード長 | 1,609 bytes |
| コンパイル時間 | 4,868 ms |
| コンパイル使用メモリ | 78,628 KB |
| 実行使用メモリ | 54,572 KB |
| 最終ジャッジ日時 | 2025-04-11 21:44:32 |
| 合計ジャッジ時間 | 8,997 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 32 |
ソースコード
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] x = new int[n];
int[] y = new int[n];
for (int i = 0; i < n; i++) {
x[i] = sc.nextInt();
y[i] = sc.nextInt();
}
sc.close();
int mod = 998244353;
long mi2 = modinv(2, mod);
long minx = 100000000;
long maxx = -100000000;
long miny = 100000000;
long maxy = -100000000;
int minxi = 0;
int maxxi = 0;
for (int i = 0; i < n; i++) {
if (x[i] < minx) {
minx = x[i];
minxi = i;
}
if (x[i] > maxx) {
maxx = x[i];
maxxi = i;
}
if (y[i] < miny) {
miny = y[i];
}
if (y[i] > maxy) {
maxy = y[i];
}
}
long ans = (maxx - minx) * (maxy - miny);
if (minxi > maxxi) {
maxxi += n;
}
for (int i = minxi; i < maxxi; i++) {
int i1 = i % n;
int i2 = (i1 + 1) % n;
long val = (y[i1] + y[i2] - 2 * miny) * (x[i2] - x[i1]) % mod * mi2 % mod;
ans -= val;
}
if (minxi < maxxi) {
minxi += n;
}
for (int i = maxxi; i < minxi; i++) {
int i1 = i % n;
int i2 = (i1 + 1) % n;
long val = (2 * maxy - y[i1] - y[i2]) * (x[i1] - x[i2]) % mod * mi2 % mod;
ans -= val;
}
ans %= mod;
if (ans < 0) {
ans += mod;
}
System.out.println(ans);
}
static long modinv(long a, int m) {
long b = m;
long u = 1;
long v = 0;
long tmp = 0;
while (b > 0) {
long t = a / b;
a -= t * b;
tmp = a;
a = b;
b = tmp;
u -= t * v;
tmp = u;
u = v;
v = tmp;
}
u %= m;
if (u < 0) u += m;
return u;
}
}
ks2m