洛谷3962 TJOI2013 數字根

2022-03-27 06:53:23 字數 1421 閱讀 3329

乙個數字的數字根定義為:這個數字每一位的數字加起來求和,反覆這個過程直到和小於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 52

31 3

4 51 5

輸出樣例#1:

8 7 6 4 2

7 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 100005

using

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 為根的有根樹,...