這是a problem from the December 2013 CodeChef Challenge並且比賽已結束。獲取子矩陣中不同元素的數量
問題陳述:
輸入: n階方矩陣,其將表示所述子矩陣的查詢。
(x1, y1, x2, y2)
x1, y1
表示左上和x2, y2
表示子矩陣的右下端。輸出:該子矩陣中不同元素的數量。
限制條件:
- 時限= 1秒
- 1≤N≤300
- 1≤Q≤10^5
- 1≤艾,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的整數。但是在你的問題中沒有任何說明! –