private static void VariousSushi() { long[] input = ReadLongArray(); long N = input[0]; long K = input[1]; Sushi[] sushiList = new Sushi[N]; for (int i = 0; i < N; i++) { sushiList[i] = new Sushi(ReadLongArray()); } sushiList = sushiList.OrderByDescending(s => s.Oishisa).ToArray(); var pq = new PriorityQueue <Sushi>( (int)N, (a, b) => a.Oishisa.CompareTo(b.Oishisa)); bool[] used = new bool[N + 1]; long cntNeta = 0; long sum = 0; long ans = 0; for (int i = 0; i < N; i++) { if (i < K) { sum += sushiList[i].Oishisa; if (used[sushiList[i].Neta]) { pq.Push(sushiList[i]); } else { used[sushiList[i].Neta] = true; cntNeta++; } } else if (!used[sushiList[i].Neta] && pq.Count() != 0) { used[sushiList[i].Neta] = true; cntNeta++; sum -= pq.Pop().Oishisa; sum += sushiList[i].Oishisa; } ChMax(ref ans, sum + cntNeta * cntNeta); } WriteLine(ans); }
static void Main(string[] args) { string[] s = Console.ReadLine().Split(' '); int N = int.Parse(s[0]), K = int.Parse(s[1]); List <Sushi> list = new List <Sushi>(); for (int i = 0; i < N; i++) { string[] s0 = Console.ReadLine().Split(' '); int t = int.Parse(s0[0]); long d = long.Parse(s0[1]); Sushi sushi = new Sushi(); sushi.d = d; sushi.t = t; list.Add(sushi); } list = list.OrderByDescending(x => x.d).ToList(); //?t?????d???Sushi?Top??????? HashSet <int> tset = new HashSet <int>(); for (int i = 0; i < N; i++) { Sushi sushi = list[i]; if (!tset.Contains(sushi.t)) { sushi.top = true; tset.Add(sushi.t); } } int indexA = K - 1; int indexB = K; var tlist = list.Take(K); long countType = tlist.GroupBy(x => x.t).Count(); long sum = tlist.Sum(x => x.d); long sd = sum + countType * countType; long smax = sd; while (indexA >= 0 && indexB < N) { while (list[indexA].top) { indexA--; if (indexA < 0) { goto Fin; } } while (!list[indexB].top) { indexB++; if (indexB >= N) { goto Fin; } } sum += list[indexB].d - list[indexA].d; countType++; long sdn = sum + countType * countType; if (sdn > smax) { smax = sdn; } indexA--; indexB++; } Fin: Console.WriteLine(smax); }