Submission #18357018


Source Code Expand

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Diagnostics;
using System.Runtime.Intrinsics.X86;
using System.Runtime.CompilerServices;

namespace FertiLib.Contest.A
{
	static class Program
	{
		public static void Solve(Scanner cin)
		{
			var (n, d) = cin.ReadValue<int, long>();
			var (x, y) = cin.ReadValueArray<long, long>(n);

			var fc = n / 2;
			var sc = n - fc;

			var first = new (long x, long y)[1];
			var second = new (long x, long y)[1];

			for (int i = 0; i < fc; i++)
			{
				var tmp1 = new (long x, long y)[first.Length];
				var tmp2 = new (long x, long y)[first.Length];
				for (int j = 0; j < first.Length; j++)
				{
					tmp1[j] = (first[j].x + x[i], first[j].y + y[i]);
					tmp2[j] = (first[j].x - x[i], first[j].y - y[i]);
				}
				first = Merge(first, tmp1);
				first = Merge(first, tmp2);
				GC.Collect();
			}

			for (int i = fc; i < n; i++)
			{
				var tmp1 = new (long x, long y)[second.Length];
				var tmp2 = new (long x, long y)[second.Length];
				for (int j = 0; j < second.Length; j++)
				{
					tmp1[j] = (second[j].x + x[i], second[j].y + y[i]);
					tmp2[j] = (second[j].x - x[i], second[j].y - y[i]);
				}
				second = Merge(second, tmp1);
				second = Merge(second, tmp2);
				GC.Collect();
			}

			long ans = long.MinValue;
			var swag = new SWAG<long>((x, y) => Math.Max(x, y));
			var l = 0;
			var r = 0;
			{
				var secondY = second.Select(p => p.y).ToArray();

				l = secondY.LowerBound(-d - first[0].x) - 1;
				r = secondY.UpperBound(d - first[0].x) - 1;
			}
			for (int i = r; i > l; i--)
			{
				swag.Push(second[i].y);
			}

			if (swag.Count > 0) Chmax(ref ans, swag.Prod());
			for (int i = 1; i < first.Length; i++)
			{
				while (l >= 0 && first[i].x + second[l].x >= -d)
				{
					swag.Push(second[l].y);
					l--;
				}
				while (r >= 0 && first[i].x + second[r].x > d)
				{
					if (l != r) swag.Pop();
					r--;
				}

				if (l >= r) continue;
				Chmax(ref ans, first[i].y + swag.Prod());
			}

			Console.WriteLine(ans);
		}

		public static T[] Merge<T>(T[] first, T[] second) where T : IComparable<T>
		{
			var ret = new T[first.Length + second.Length];
			int p = 0;
			int q = 0;
			while (p < first.Length || q < second.Length)
			{
				if (p == first.Length)
				{
					ret[p + q] = second[q];
					q++;
					continue;
				}
				if (q == second.Length)
				{
					ret[p + q] = first[p];
					p++;
					continue;
				}
				if (first[p].CompareTo(second[q]) < 0)
				{
					ret[p + q] = first[p];
					p++;
				}
				else
				{
					ret[p + q] = second[q];
					q++;
				}
			}
			return ret;
		}

		public static void Main(string[] args)
		{
			var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
			Console.SetOut(sw);
			var cin = new Scanner();
			Solve(cin);
			Console.Out.Flush();
		}

		public static void YESNO(bool condition) => Console.WriteLine(condition ? "YES" : "NO");
		public static void YesNo(bool condition) => Console.WriteLine(condition ? "Yes" : "No");
		public static void yesno(bool condition) => Console.WriteLine(condition ? "yes" : "no");

		public static bool Chmax<T>(ref T a, T b) where T : IComparable<T>
		{
			if (a.CompareTo(b) >= 0) return false;
			a = b;
			return true;
		}
		public static bool Chmin<T>(ref T a, T b) where T : IComparable<T>
		{
			if (a.CompareTo(b) <= 0) return false;
			a = b;
			return true;
		}
	}

	public class SWAG<T>
	{
		Stack<(T value, T prod)> front, back;
		Func<T, T, T> monoid;

		public int Count { get; private set; }

		public SWAG(Func<T, T, T> monoid)
		{
			this.monoid = monoid;
			front = new Stack<(T value, T prod)>();
			back = new Stack<(T value, T prod)>();
		}

		public SWAG(IEnumerable<T> list, Func<T, T, T> monoid) : this(monoid)
		{
			foreach (var e in list)
			{
				Push(e);
			}
		}

		public T Prod()
		{
			if (front.Count == 0 && back.Count == 0) throw new InvalidOperationException();
			if (front.Count == 0) return back.Peek().prod;
			if (back.Count == 0) return front.Peek().prod;
			return monoid(front.Peek().prod, back.Peek().prod);
		}

		public void Push(T x)
		{
			Count++;
			if (back.Count == 0) back.Push((x, x));
			else back.Push((x, monoid(back.Peek().prod, x)));
		}

		public T Pop()
		{
			if (Count == 0) throw new InvalidOperationException();
			Count--;
			if (front.Count == 0)
			{
				while (back.Count > 0)
				{
					var e = back.Pop();
					if (front.Count == 0) front.Push((e.value, e.value));
					else front.Push((e.value, monoid(front.Peek().prod, e.value)));
				}
			}
			return front.Pop().value;
		}
	}

	public class Deque<T> : IEnumerable<T>
	{
		int dx;
		T[] buffer;
		int mask;

		public int Count { get; private set; }

		public Deque() : this(8) { }

		public Deque(int capacity)
		{
			if (capacity != (capacity & -capacity))
			{
				int tmp = capacity;
				capacity = 1;
				while (capacity < tmp)
				{
					capacity <<= 1;
				}
			}
			mask = capacity - 1;
			buffer = new T[capacity];
		}

		public Deque(IEnumerable<T> value) : this(value.Count())
		{
			int i = 0;
			foreach (var e in value)
			{
				buffer[i] = e;
				i++;
			}
		}

		public T this[int index]
		{
			get
			{
				return buffer[(index + dx) & mask];
			}
			set
			{
				if (0 <= index && index < Count) throw new IndexOutOfRangeException();
				buffer[(index + dx) & mask] = value;
			}
		}

		public void PushFront(T item)
		{
			if (Count == buffer.Length) extend();
			dx = (dx + buffer.Length - 1) & mask;
			buffer[dx] = item;
			Count++;
		}

		public T PopFront()
		{
			var ret = buffer[dx = (dx + 1) & mask];
			Count--;
			return ret;
		}

		public T Last => buffer[(dx + Count - 1) & mask];

		public void PushBack(T item)
		{
			if (Count == buffer.Length) extend();
			buffer[(dx + Count++) & mask] = item;
		}


		public T PopBack()
		{
			var ret = buffer[(dx + --Count) & mask];
			return ret;
		}

		public T First => buffer[dx];

		private void extend()
		{
			var newBuffer = new T[buffer.Length * 2];
			for (int i = 0; i < buffer.Length; i++)
			{
				newBuffer[i] = buffer[(dx + i) & mask];
			}
			mask = newBuffer.Length - 1;
			dx = 0;
			buffer = newBuffer;
		}

		public void Clear()
		{
			Count = 0;
			buffer = new T[8];
			dx = 0;
			mask = buffer.Length - 1;
		}

		public void AddAt(int index, T item)
		{
			PushFront(item);
			for (int i = 0; i < index; i++)
			{
				this[i] = this[i + 1];
			}
			this[index] = item;
		}

		public T RemoveAt(int index)
		{
			var ret = this[index];
			for (int i = index; i > 0; i--)
			{
				this[i] = this[i - 1];
			}
			PopFront();
			return ret;
		}

		public IEnumerator<T> GetEnumerator()
		{
			for (int i = 0; i < Count; i++)
			{
				yield return this[i];
			}
		}

		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => this.GetEnumerator();

		public T[] Items
		{
			get
			{
				var ret = new T[Count];
				for (int i = 0; i < Count; i++)
				{
					ret[i] = this[i];
				}
				return ret;
			}
		}
	}

	static class Extention
	{
		public static string Join<T>(this IEnumerable<T> x, string separator = "") => string.Join(separator, x);

		public static int UpperBound<T>(this IList<T> list, T value) => list.BinarySearch(value, true, 0, list.Count, Comparer<T>.Default);
		public static int LowerBound<T>(this IList<T> list, T value) => list.BinarySearch(value, false, 0, list.Count, Comparer<T>.Default);
		public static int BinarySearch<T>(this IList<T> list, T value, bool isUpperBound, int index, int length, Comparer<T> comparer)
		{
			var ng = index - 1;
			var ok = index + length;
			while (ok - ng > 1)
			{
				var mid = ng + (ok - ng) / 2;
				var res = comparer.Compare(list[mid], value);
				if (res < 0 || (isUpperBound && res == 0)) ng = mid;
				else ok = mid;
			}
			return ok;
		}
	}

	class Scanner
	{
		string[] s;
		int i;

		char[] separator = new char[] { ' ' };

		public Scanner()
		{
			s = new string[0];
			i = 0;
		}

		public string Read() => ReadString();

		public string ReadString()
		{
			if (i < s.Length) return s[i++];
			string st = Console.ReadLine();
			while (st == "") st = Console.ReadLine();
			s = st.Split(separator, StringSplitOptions.RemoveEmptyEntries);
			if (s.Length == 0) return ReadString();
			i = 0;
			return s[i++];
		}

		public string[] ReadStringArray(int N)
		{
			string[] Array = new string[N];
			for (int i = 0; i < N; i++)
			{
				Array[i] = ReadString();
			}
			return Array;
		}

		public int ReadInt() => int.Parse(ReadString());

		public int[] ReadIntArray(int N, int add = 0)
		{
			int[] Array = new int[N];
			for (int i = 0; i < N; i++)
			{
				Array[i] = ReadInt() + add;
			}
			return Array;
		}

		public long ReadLong() => long.Parse(ReadString());

		public long[] ReadLongArray(int N, long add = 0)
		{
			long[] Array = new long[N];
			for (int i = 0; i < N; i++)
			{
				Array[i] = ReadLong() + add;
			}
			return Array;
		}

		public double ReadDouble() => double.Parse(ReadString());

		public double[] ReadDoubleArray(int N, double add = 0)
		{
			double[] Array = new double[N];
			for (int i = 0; i < N; i++)
			{
				Array[i] = ReadDouble() + add;
			}
			return Array;
		}

		public T1 ReadValue<T1>() => (T1)Convert.ChangeType(ReadString(), typeof(T1));

		public (T1, T2) ReadValue<T1, T2>()
		{
			var inputs = ReadStringArray(2);
			var v1 = (T1)Convert.ChangeType(inputs[0], typeof(T1));
			var v2 = (T2)Convert.ChangeType(inputs[1], typeof(T2));
			return (v1, v2);
		}

		public (T1, T2, T3) ReadValue<T1, T2, T3>()
		{
			var inputs = ReadStringArray(3);
			var v1 = (T1)Convert.ChangeType(inputs[0], typeof(T1));
			var v2 = (T2)Convert.ChangeType(inputs[1], typeof(T2));
			var v3 = (T3)Convert.ChangeType(inputs[2], typeof(T3));
			return (v1, v2, v3);
		}

		public (T1, T2, T3, T4) ReadValue<T1, T2, T3, T4>()
		{
			var inputs = ReadStringArray(4);
			var v1 = (T1)Convert.ChangeType(inputs[0], typeof(T1));
			var v2 = (T2)Convert.ChangeType(inputs[1], typeof(T2));
			var v3 = (T3)Convert.ChangeType(inputs[2], typeof(T3));
			var v4 = (T4)Convert.ChangeType(inputs[3], typeof(T4));
			return (v1, v2, v3, v4);
		}

		public (T1, T2, T3, T4, T5) ReadValue<T1, T2, T3, T4, T5>()
		{
			var inputs = ReadStringArray(5);
			var v1 = (T1)Convert.ChangeType(inputs[0], typeof(T1));
			var v2 = (T2)Convert.ChangeType(inputs[1], typeof(T2));
			var v3 = (T3)Convert.ChangeType(inputs[2], typeof(T3));
			var v4 = (T4)Convert.ChangeType(inputs[3], typeof(T4));
			var v5 = (T5)Convert.ChangeType(inputs[4], typeof(T5));
			return (v1, v2, v3, v4, v5);
		}

		public (T1, T2, T3, T4, T5, T6) ReadValue<T1, T2, T3, T4, T5, T6>()
		{
			var inputs = ReadStringArray(6);
			var v1 = (T1)Convert.ChangeType(inputs[0], typeof(T1));
			var v2 = (T2)Convert.ChangeType(inputs[1], typeof(T2));
			var v3 = (T3)Convert.ChangeType(inputs[2], typeof(T3));
			var v4 = (T4)Convert.ChangeType(inputs[3], typeof(T4));
			var v5 = (T5)Convert.ChangeType(inputs[4], typeof(T5));
			var v6 = (T6)Convert.ChangeType(inputs[5], typeof(T6));
			return (v1, v2, v3, v4, v5, v6);
		}

		public (T1, T2, T3, T4, T5, T6, T7) ReadValue<T1, T2, T3, T4, T5, T6, T7>()
		{
			var inputs = ReadStringArray(7);
			var v1 = (T1)Convert.ChangeType(inputs[0], typeof(T1));
			var v2 = (T2)Convert.ChangeType(inputs[1], typeof(T2));
			var v3 = (T3)Convert.ChangeType(inputs[2], typeof(T3));
			var v4 = (T4)Convert.ChangeType(inputs[3], typeof(T4));
			var v5 = (T5)Convert.ChangeType(inputs[4], typeof(T5));
			var v6 = (T6)Convert.ChangeType(inputs[5], typeof(T6));
			var v7 = (T7)Convert.ChangeType(inputs[6], typeof(T7));
			return (v1, v2, v3, v4, v5, v6, v7);
		}

		public T1[] ReadValueArray<T1>(int N)
		{
			var v1 = new T1[N];
			for (int i = 0; i < N; i++)
			{
				v1[i] = ReadValue<T1>();
			}
			return v1;
		}

		public (T1[], T2[]) ReadValueArray<T1, T2>(int N)
		{
			var (v1, v2) = (new T1[N], new T2[N]);
			for (int i = 0; i < N; i++)
			{
				var (t1, t2) = ReadValue<T1, T2>();
				v1[i] = t1;
				v2[i] = t2;
			}
			return (v1, v2);
		}

		public (T1[], T2[], T3[]) ReadValueArray<T1, T2, T3>(int N)
		{
			var (v1, v2, v3) = (new T1[N], new T2[N], new T3[N]);
			for (int i = 0; i < N; i++)
			{
				var (t1, t2, t3) = ReadValue<T1, T2, T3>();
				v1[i] = t1;
				v2[i] = t2;
				v3[i] = t3;
			}
			return (v1, v2, v3);
		}

		public (T1[], T2[], T3[], T4[]) ReadValueArray<T1, T2, T3, T4>(int N)
		{
			var (v1, v2, v3, v4) = (new T1[N], new T2[N], new T3[N], new T4[N]);
			for (int i = 0; i < N; i++)
			{
				var (t1, t2, t3, t4) = ReadValue<T1, T2, T3, T4>();
				v1[i] = t1;
				v2[i] = t2;
				v3[i] = t3;
				v4[i] = t4;
			}
			return (v1, v2, v3, v4);
		}

		public (T1[], T2[], T3[], T4[], T5[]) ReadValueArray<T1, T2, T3, T4, T5>(int N)
		{
			var (v1, v2, v3, v4, v5) = (new T1[N], new T2[N], new T3[N], new T4[N], new T5[N]);
			for (int i = 0; i < N; i++)
			{
				var (t1, t2, t3, t4, t5) = ReadValue<T1, T2, T3, T4, T5>();
				v1[i] = t1;
				v2[i] = t2;
				v3[i] = t3;
				v4[i] = t4;
				v5[i] = t5;
			}
			return (v1, v2, v3, v4, v5);
		}

		public (T1[], T2[], T3[], T4[], T5[], T6[]) ReadValueArray<T1, T2, T3, T4, T5, T6>(int N)
		{
			var (v1, v2, v3, v4, v5, v6) = (new T1[N], new T2[N], new T3[N], new T4[N], new T5[N], new T6[N]);
			for (int i = 0; i < N; i++)
			{
				var (t1, t2, t3, t4, t5, t6) = ReadValue<T1, T2, T3, T4, T5, T6>();
				v1[i] = t1;
				v2[i] = t2;
				v3[i] = t3;
				v4[i] = t4;
				v5[i] = t5;
				v6[i] = t6;
			}
			return (v1, v2, v3, v4, v5, v6);
		}

		public (T1[], T2[], T3[], T4[], T5[], T6[], T7[]) ReadValueArray<T1, T2, T3, T4, T5, T6, T7>(int N)
		{
			var (v1, v2, v3, v4, v5, v6, v7) = (new T1[N], new T2[N], new T3[N], new T4[N], new T5[N], new T6[N], new T7[N]);
			for (int i = 0; i < N; i++)
			{
				var (t1, t2, t3, t4, t5, t6, t7) = ReadValue<T1, T2, T3, T4, T5, T6, T7>();
				v1[i] = t1;
				v2[i] = t2;
				v3[i] = t3;
				v4[i] = t4;
				v5[i] = t5;
				v6[i] = t6;
				v7[i] = t7;
			}
			return (v1, v2, v3, v4, v5, v6, v7);
		}
	}
}

Submission Info

Submission Time
Task F - 財宝 (Treasures)
User fairy_lettuce
Language C# (.NET Core 3.1.201)
Score 100
Code Size 14646 Byte
Status AC
Exec Time 2921 ms
Memory 1018548 KiB

Judge Result

Set Name set01 set02 set03 set04 set05
Score / Max Score 20 / 20 20 / 20 20 / 20 20 / 20 20 / 20
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
set01 data1
set02 data2
set03 data3
set04 data4
set05 data5
Case Name Status Exec Time Memory
data1 AC 87 ms 28256 KiB
data2 AC 2921 ms 900248 KiB
data3 AC 2686 ms 901368 KiB
data4 AC 2317 ms 602332 KiB
data5 AC 2705 ms 1018548 KiB