Это было a problem from the December 2013 CodeChef Challenge, и конкурс закончился.Получите количество отдельных элементов в подматрице
Постановка задачи:
Вход: квадратная матрица порядка п и запрос, который будет обозначать подматрицы.
(x1, y1, x2, y2)
x1, y1
обозначает верхний левый иx2, y2
обозначает нижний правый конец подматрицы.Выход: Количество различных элементов в этой подматрице.
Ограничения:
- Ограничение по времени = 1 сек
- 1 ≤ N ≤ 300
- 1 ≤ Q ≤ 10^5
- 1 ≤ Ai, J ≤ 10
- 1 ≤ X1 ≤ X2 ≤ N
- 1 ≤ Y1 ≤ Y2 ≤ N
Это то, что я пробовал:
#include<stdio.h>
//#include<conio.h>
int main()
{
//clrscr();
int a[300][300], test[100000], count[10], m, n, c, j, p, q, r, s;
long qu, re, i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
scanf("%ld", &qu);
for (re = 0; re < qu; re++)
{
c = 0;
for(i = 0; i < 10; i++)
{
count[i] = 0;
}
scanf("%d %d %d %d", &p, &q, &r, &s);
for (i = (p-1); i < r; i++)
{
for (j = (q-1); j < s; j++)
{
m = a[i][j];
count[--m]++;
}
}
for (i = 0; i < 10; i++)
{
if (count[i] != 0)
{
c++;
}
}
test[re] = c;
}
for(i = 0; i < qu; i++)
{
printf("%d\n", test[i]);
}
//getch();
return 0;
}
Но я получил TLE (ограничение превышено время) ошибка.
Он должен что-то делать с суммарной частотой каждого номера.
Может кто-нибудь предложить эффективный алгоритм для решения этой проблемы?
Ваш код должен быть правильно отступом, чтобы было легче читать его. Кроме того, вы должны использовать более значимые имена переменных, а не одно или два имени переменной. –
Кажется, вы предполагаете, что матрица будет содержать целые числа от 0 до 9. Но об этом в вашем вопросе нигде не сказано! –