1. 程式人生 > >JZ模擬賽 8.11

JZ模擬賽 8.11

情感 二分答案 alt 簡單 過程 圖片 線性篩 我們 一行

B組:

T1:

Description

nodgd的粉絲太多了,每天都會有很多人排隊要簽名。
今天有??個人排隊,每個人的身高都是一個整數,且互不相同。很不巧,nodgd今天去忙別的事情去了,就只好讓這些粉絲們明天再來。同時nodgd提出了一個要求,每個人都要記住自己前面與多少個比自己高的人,以便於明天恢復到今天的順序。
但是,粉絲們或多或少都是有些失望的,失望使她們暈頭轉向、神魂顛倒,已經分不清楚哪一邊是“前面”了,於是她們可能是記住了前面比自己高的人的個數,也可能是記住了後面比自己高的人的個數,而且他們不知道自己記住的是哪一個方向。
nodgd覺得,即使這樣明天也能恢復出一個排隊順序,使得任意一個人的兩個方向中至少有一個方向上的比他高的人數和他記住的數字相同。可惜??比較大,顯然需要寫個程序來解決,nodgd很忙,寫程序這種事情就交給你了。

Data Constraint

n<=100000
ai<=10^9

Output

輸出一行,這個隊列裏從前到後的每個人的身高。如果有多個答案滿足題意,輸出字典序最小。如果不存在滿足題意的排列,輸出“impossible”(不含引號)。 Solution: 比較套路的想法。 按身高從小到大,給位置開一個線段樹,該位置有,就是1,否則是0. 期初都是1,身高最小的記的數字是x, 那麽,她要麽在第x+1個位置,要麽在n-x個位置。選擇一個字典序最小的,即較靠前的位置。 把這個位置在線段樹上歸零。 重復這樣的操作,每次在線段樹上二分,找到剩余的滿足的兩個位置。 為什麽是對的? 因為身高從小到大,考慮小的時候,別的都是比她大的,比她小的已經歸位。 所以,剩余位置總是一定的情況下,前面怎麽放是不影響後面的,也不影響無解情況。 所以,小的就按照字典序最小貪心了。 判斷無解:線段樹二分的時候,如果到了葉子節點,但是kth不為1,就是無解了。 T2:

Description

小X 是一位熱愛數學的男孩子,在茫茫的數字中,他對質數更有一種獨特的情感。小X 認為,質數是一切自然數起源的地方。
在小X 的認知裏,質數是除了本身和1 以外,沒有其他因數的數字。
但由於小X 對質數的熱愛超乎尋常,所以小X 同樣喜歡那些雖然不是質數,但卻是由兩個質數相乘得來的數。
於是,我們定義,一個數是小X 喜歡的數,當且僅當其是一個質數,或是兩個質數的乘積。
而現在,小X 想要知道,在L 到R 之間,有多少數是他喜歡的數呢? 技術分享圖片

Solution:

質數好處理,關鍵是兩個質數的乘積怎麽辦?

考慮線性篩的過程,每個合數只會被它的最小質因子篩一次,如果一個合數是兩個質數的乘積,那麽和它最小質因子相乘的數一定也是質數。

所以, 在線性篩的時候,不光記錄vis,還記錄這個數是不是兩個質數乘積。

if(!vis[i]) has[i*pri[j]]=1 has數組就標記了合數。

然後,1e7前綴和處理一下,查詢直接O(1)

或者每次二分答案也可以。

T3:

Description

nodgd寫了一篇文章,自認為這是一篇好文章。nodgd的文章由??個小寫英文字母組成。文章的一個子串指的是文章中的一段連續的字母,子串的長度就是這一段的字母個數。nodgd在文章中用了排比、對偶、前後照應之類的手法,所以就有很多個子串是相同或者相近的。為了向大家證明這是一篇好文章,nodgd決定給自己的文章進行評分。nodgd首先確定了一個整數??,然後統計出文章中有多少個不相同的長度為??的子串,這個數量就是文章的評分。
然而,nodgd懶得老老實實計算這個評分了,就把任務丟給了你。

Data Constraint

對於30%的數據,1≤??≤??≤200;
對於50%的數據,1≤??≤??≤2000;
對於另外20%的數據,1≤??≤50≤??≤200000;
對於100%的數據,1≤??≤??≤200000。 Solution: 裸的哈希,但是顯然不會這麽簡單。 出題人卡哈希卡到了極致。1e9+7 1e9+9的質數都能卡到70分。更小的就更不用說了。 所以雙哈希。 當一個字符串在兩個set裏有一次沒有出現的話,就認為是一個新的字符串。 因為,可能因為取模的問題,把不同的模成了相同的。

JZ模擬賽 8.11