В общем, все мои попытки показать, что моно шлак, и это НЕ C#, не увенчались успехом.
Забудем про то, что в Моно нет SortedSet, и участники, использующие C# оказываются позади тех, кто юзает C++ или Java по любой задаче, где надо строить любые деревья.
Практический пример. Задача E с последнего раунда. Решение за квадрат:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace moomoo
{
class Program
{
static void Main(string[] args)
{
int k;
int n;
string s = Console.ReadLine();
var ss = s.Split(' ');
n = int.Parse(ss[0]);
k = int.Parse(ss[1]);
s = Console.ReadLine();
int[] h = (from v in s.Split(' ') select int.Parse(v)).ToArray();
int ans = 0;
List<KeyValuePair<int, int>> ansv = new List<KeyValuePair<int, int>>();
List<int> mx = new List<int>(); ;
List<int> mn = new List<int>();
int lf = 0;
for (int i = 0; i < n; ++i)
{
mx.Add(h[i]);
mn.Add(h[i]);
mx.Sort(); mx.Reverse();
mn.Sort();
while (mx[0] - mn[0] > k)
{
for (int j = 0; j < mn.Count; ++j) if (mn[j] == h[lf]) { mn.RemoveAt(j); break; }
for (int j = 0; j < mx.Count; ++j) if (mx[j] == h[lf]) { mx.RemoveAt(j); break; }
++lf;
}
int cur = i - lf + 1;
if (cur > ans)
{
ans = cur;
ansv.Clear();
ansv.Add(new KeyValuePair<int, int>(lf + 1, i + 1));
}
else if (cur == ans)
{
ansv.Add(new KeyValuePair<int, int>(lf + 1, i + 1));
}
}
Console.WriteLine(ans + " " + ansv.Count);
for (int i = 0; i < ansv.Count; ++i) Console.WriteLine(ansv[i].Key + " " + ansv[i].Value);
}
}
}
Очевидно получить TLE. Система возвращает RE на тесте 7.
Меняем местами первые две строки (int k; и int n;). Отправляем - RE на тесте 5. То есть порядок объявления переменных важен для прохождения двух тестов? Добавляем пробел, перевод строки, что угодно - RE на другом тесте. Можно дойти аж до девятого, можно упасть на первом.
Я переписывал это решение дважды целиком с нуля, и каждый раз эта история.
Забудем про то, что в Моно нет SortedSet, и участники, использующие C# оказываются позади тех, кто юзает C++ или Java по любой задаче, где надо строить любые деревья.
Практический пример. Задача E с последнего раунда. Решение за квадрат:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace moomoo
{
class Program
{
static void Main(string[] args)
{
int k;
int n;
string s = Console.ReadLine();
var ss = s.Split(' ');
n = int.Parse(ss[0]);
k = int.Parse(ss[1]);
s = Console.ReadLine();
int[] h = (from v in s.Split(' ') select int.Parse(v)).ToArray();
int ans = 0;
List<KeyValuePair<int, int>> ansv = new List<KeyValuePair<int, int>>();
List<int> mx = new List<int>(); ;
List<int> mn = new List<int>();
int lf = 0;
for (int i = 0; i < n; ++i)
{
mx.Add(h[i]);
mn.Add(h[i]);
mx.Sort(); mx.Reverse();
mn.Sort();
while (mx[0] - mn[0] > k)
{
for (int j = 0; j < mn.Count; ++j) if (mn[j] == h[lf]) { mn.RemoveAt(j); break; }
for (int j = 0; j < mx.Count; ++j) if (mx[j] == h[lf]) { mx.RemoveAt(j); break; }
++lf;
}
int cur = i - lf + 1;
if (cur > ans)
{
ans = cur;
ansv.Clear();
ansv.Add(new KeyValuePair<int, int>(lf + 1, i + 1));
}
else if (cur == ans)
{
ansv.Add(new KeyValuePair<int, int>(lf + 1, i + 1));
}
}
Console.WriteLine(ans + " " + ansv.Count);
for (int i = 0; i < ansv.Count; ++i) Console.WriteLine(ansv[i].Key + " " + ansv[i].Value);
}
}
}
Очевидно получить TLE. Система возвращает RE на тесте 7.
Меняем местами первые две строки (int k; и int n;). Отправляем - RE на тесте 5. То есть порядок объявления переменных важен для прохождения двух тестов? Добавляем пробел, перевод строки, что угодно - RE на другом тесте. Можно дойти аж до девятого, можно упасть на первом.
Я переписывал это решение дважды целиком с нуля, и каждый раз эта история.