結果
問題 |
No.2672 Subset Xor Sum
|
ユーザー |
![]() |
提出日時 | 2024-04-07 00:22:07 |
言語 | C# (.NET 8.0.404) |
結果 |
AC
|
実行時間 | 148 ms / 2,000 ms |
コード長 | 5,843 bytes |
コンパイル時間 | 8,764 ms |
コンパイル使用メモリ | 166,648 KB |
実行使用メモリ | 188,220 KB |
最終ジャッジ日時 | 2024-10-01 04:15:20 |
合計ジャッジ時間 | 14,499 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 66 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (94 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
using System; using System.Text; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Numerics; using Compro.IO; using static Compro.Common.ComproUtils; namespace Compro { public class Program { public static void Main(string[] args) { var solver = new AtCoder.Solver(); solver.Solve(); } } } namespace AtCoder { public class Solver { private readonly StreamScanner scanner; public Solver() { scanner = new StreamScanner(Console.OpenStandardInput()); } public void Solve() { var n = scanner.NextInt(); var a = scanner.ScanIntArray(n); Console.WriteLine(check(n, a) ? "Yes": "No"); } private bool check(int n, int[] A) { var xor = A.Aggregate(0, (cur, nxt) => cur ^ nxt); if (xor != 0) { return false; } if (n > 5555 || A.Contains(0)) { return true; } int m = (1 << 13); var dp = Enumerable.Repeat(INF, m).ToArray(); dp[A[0]] = 1; foreach (var a in A[1..]) { var ndp = Enumerable.Repeat(INF, m).ToArray(); for (int i = 0; i < m; ++i) { ndp[i] = Math.Min(ndp[i], dp[i]); ndp[i ^ a] = Math.Min(ndp[i ^ a], dp[i] + 1); } dp = ndp; } return dp[0] != n; } } } namespace Compro.Common { public static class ComproUtils { public static readonly long LINF = long.MaxValue / 2; public static readonly int INF = int.MaxValue / 2; public static readonly int[] dr = new[] { 0, 1, 0, -1 }; public static readonly int[] dc = new[] { 1, 0, -1, 0 }; public const string ds = "RBLF"; public static long gcd(long x, long y) => y == 0 ? x : gcd(y, x % y); public static long lcm(long x, long y) => x * (y / gcd(x, y)); /// <summary> /// nの約数を列挙する /// </summary> /// <param name="n"></param> /// <returns></returns> public static IEnumerable<long> GenDivisor(long n) { for (long i = 1L; i * i <= n; ++i) { if (n % i == 0) { yield return i; if (i * i != n) yield return n / i; } } } /// <summary> /// aを素因数分解する Dict<long primeNumber, int count> /// </summary> /// <param name="a"></param> /// <returns></returns> public static Dictionary<long, int> PrimeFactorization(long a) { var dict = new Dictionary<long, int>(); if (a == 0) return dict; int cnt = 0; while (a % 2 == 0) { a /= 2; cnt++; } if (cnt > 0) { dict.Add(2, cnt); } for(long p = 3; p * p <= a; p += 2) { cnt = 0; while (a % p == 0) { cnt++; a /= p; } dict.Add(p, cnt); } if (a > 1) { dict.Add(a, 1); } return dict; } } } namespace Compro.IO { using System.IO; using System.Text; using System.Globalization; using System; public class StreamScanner { private readonly Stream stream; private readonly byte[] buffer = new byte[1024]; private int size, ptr; private bool isEOF = false; public StreamScanner(Stream stream) { this.stream = stream; ptr = 0; size = 0; } private byte read() { if (isEOF) return 0; if (ptr >= size) { ptr = 0; size = stream.Read(buffer, 0, 1024); if (size <= 0) { isEOF = true; return 0; } } return buffer[ptr++]; } public char Char() { byte b = 0; do { b = read(); } while ((b < 33 || 126 < b) && !isEOF); return (char)b; } public string Scan() { var sb = new StringBuilder(); for (var b = Char(); b >= 33 && b <= 126; b = (char)read()) sb.Append(b); return sb.ToString(); } public int NextInt() { return isEOF ? Int32.MinValue : Int32.Parse(Scan(), CultureInfo.InvariantCulture); } public long NextLong() { return isEOF ? Int64.MinValue : Int64.Parse(Scan(), CultureInfo.InvariantCulture); } public double NextDouble() { return isEOF ? Double.MinValue : Double.Parse(Scan(), CultureInfo.InvariantCulture); } public int[] ScanIntArray(int size) { var res = new int[size]; for (int i = 0; i < size; ++i) res[i] = NextInt(); return res; } public long[] ScanLongArray(int size) { var res = new long[size]; for (int i = 0; i < size; ++i) res[i] = NextLong(); return res; } public double[] ScanDoubleArray(int size) { var res = new double[size]; for (int i = 0; i < size; ++i) res[i] = NextDouble(); return res; } } }