乙個數字的數字根定義為:這個數字每一位的數字加起來求和,反覆這個過程直到和小於10。例如,64357的數字跟為7,因為6+4+3+5+7=25,2+5=7個區間的數字根定義為這個區間所有數字和的數字根。
給定乙個序列a1,a2,a3,…,an,你需要回答一些詢問。每乙個詢問給定個區間[l,r],求出這個區間所有連續子區間裡最大的前5個不同的數字根,不夠5個的用-1補全
輸入格式:
第一行乙個整數n,表示序列的長度。第二行是n個整數ai(0≤ai<10^9)。第三行是乙個整數q表示詢問次數。接下來q行,每一行兩個正整數1,r,表示詢問區間。(1≤l≤r≤n)
輸出格式:
q行,表示每乙個查詢區間所有連續子區間裡最大的前5個不同的數字根,按降序輸出,輸出用空格隔開。
輸入樣例#1:
5
101 240 331 4 5231 3
4 51 5
輸出樣例#1:
8 7 6 4 27 4 2 -1 -1
9 8 7 6 4
樣例解釋
第乙個查詢區間[1,3],它的連續子區間有[1,1],[2,2],[3,3],[1,2],[2,3],[1,3].可對應的數字根分別為2,6,7,8,4,6。所以最大的5個是8,7,6,4,2。
資料範圍
30%的資料,n ≤ 1000; q ≤ 1000
100%的資料,n ≤ 100000; q ≤ 100000
感覺懂了數字根是什麼就會做這個題了。(我去徵求vane的意見時,發現他也不懂數字根,他和我說要記憶化搜尋……)
結論就是 數字根=各位加在一起%9 (如果是0就=9)
現在有了思路,以後有了證明再補吧。
於是就預處理字首和,暴力列舉[l,r]內的子區間,因為答案只有0~9,而且只要求你輸出前5個,當你已經找到5,6,7,8,9時就可以退出了,
所以這麼暴力的做法是超不了時的
#include#define maxn 100005using
namespace
std;
intread()
return
x;}
intn,q,l,r,a[maxn],s[maxn];
bool b[10
];void
query()
}for(int i=9;i>=1;i--)
if(k&&b[i])printf("
%d ",i),k--;
for(int i=1;i<=k;i++)printf("
-1 "
); printf("\n
");}int
main()
洛谷P4304 TJOI2013 攻擊裝置 題解
最大獨立集 總點數 最大匹配數 獨立集 點集,圖中選一堆點,這堆點兩兩之間沒有連邊 最大獨立集 盡可能多得選點,使得其滿足獨立集的性質 這是網路流二分圖經典題目,值得練習 include include include using namespace std int x 9 int y 9 stru...
洛谷P4309 TJOI2013 最長上公升子串行
給定乙個序列,初始為空。現在我們將1到n的數字插入到序列中,每次將乙個數字插入到乙個特定的位置。每插入乙個數字,我們都想知道此時最長上公升子串行長度是多少?第一行乙個整數n,表示我們要將1到n插入序列中,接下是n個數字,第k個數字xk,表示我們將k插入到位置xk 0 xk k 1,1 k n n行,...
洛谷3761,TJOI2017城市
這道題一開始在想可以列舉每個點對,嘗試刪除其間的邊,因為有o n2 個點對,所以要o 1 更新答案 後來發現,因為是樹,所以只有o n 個點對是有用的 這麼顯然的結論一開始沒發現,看來還是我太弱了 然後就可以每次o n 判斷 首先定義在一棵樹 x 中,對於點y,f x,y 等於以 y 為根的有根樹,...