Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }