這是一個比賽Q:如何找到3的倍數
有N個數字a [0],a [1] .. a [N - 1]。 Initally都是0。你必須執行操作的兩種類型:
- 增加1指數A和B之間的數字這是通過命令「0 AB」指數之間
- 回答多少個號碼代表A和B可以被3整除。這由命令「1 AB」表示。
輸入:第一行包含兩個整數,N和Q.
每個下一個Q線的要麼是形式爲「0 A B」或上述「1 A B」的。
輸出:輸出1行,用於包含相應查詢所需答案的「1A B」格式的每個查詢。
樣品輸入:
4 7 1 0 3 0 1 2 0 1 3 1
0 0 0 0 3 1 3 3 1 0 3
樣本輸出:
4 1 0 2
約束:
1 <= N <= 100000 1 <= Q <= 100000 0 <= A <= B <= N - 1
我不知道如何解決這個問題。你能幫忙嗎?
時間限制爲1秒。我試圖蠻力,我也試圖保存每個我i元素前的3個除數。
,這裏是我的C代碼:
#include <stdio.h>
int nums[100*1000+20];
int d[100*1000+20];
int e[100*1000+20];
int dah[100*1000+20];
int main()
{
int n,q;
scanf("%d%d",&n,&q);
int h;
for(h=0;h<n;h++)
{d[h/100]++; e[h/1000]++; dah[h/10]++;}
int test;
for(test=0;test<q;test++)
{
int op,start,end;
scanf("%d%d%d",&op,&start,&end);
if(0==op)
{
int x;
for(x=start;x<=end;x++)
{
nums[x]++;
nums[x]%=3;
if(nums[x]==0)
{
d[x/100]++;
e[x/1000]++;
dah[x/10]++;
}
else if(nums[x]==1)
{
d[x/100]--;
e[x/1000]--;
dah[x/10]--;
}
}
}
else if(1==op)
{
int f;
int ans=0;
for(f=start;f<=end;)
{
if(f%1000==0&&f+1000<end)
{
ans+=e[f/1000];
f+=1000;
}
else if(f%100==0&&f+100<end)
{
ans+=d[f/100];
f+=100;
}
else if(f%10==0&&f+10<end)
{
ans+=dah[f/10];
f+=10;
}
else
{
ans+=(nums[f]==0);
f++;
}
}
printf("%d\n",ans);
}
}
return 0;
}
在這種方法我保存的* 1000和(k + 1)* 1000,也對於k同樣的事情K的3倍數的數量* 100和(k +1)* 100,也爲10.這有助於我更快地查詢。但是這卻讓我超越了時間限制。
你可以重新格式化這個可讀性? – Oded 2010-09-01 16:24:46
做你自己的家庭作業 – jer 2010-09-01 16:25:29
@jer - 作業題目在這裏是有效和合法的。我們通過提供提示來回答他們,而不是全面的答案。 – Oded 2010-09-01 16:26:13