WerKeyTom FTD的模擬賽 永恆的契約

2021-07-24 08:10:13 字數 2832 閱讀 1912

宅邸迅速的燃燒著,必須帶貝蒂走出**庫!憑著感覺,又一次直接找到**庫的門。

「你,是那個人嘛?」400年了,當初聖域建立結界時沒有進入聖域,被傷了心的人工精靈貝蒂,與強欲魔女簽訂契約,守護宅邸的**庫,直至「那個人」的到來,那個人會解開貝蒂的心結。

「我不是那個什麼人,但我會成為你唯一的人。我會給你幸福!」

精靈與人簽訂契約,從此相依為命。這便是,永恆的契約。

宅邸裡,羅茲瓦爾的房間圖書櫃後,有一條鏈結宅邸和聖域的秘密通道,其中有乙個神奇的大回環,由n塊石頭組成。

第i塊石頭有乙個高度ai,兩塊不同的石頭i,j能夠互相看到,則它們在環上的兩條路徑中有至少一條路徑上除了兩個端點(即i,j)路徑上石頭高度都不大於min(ai,aj)。

被羅茲瓦爾僱傭的獵腸者躲在這秘密的通道中,為了能夠更好的觀察通道中的情況,她想知道有多少對石頭能夠互相看到。

第一行乙個正整數t,表示資料組數。

接下來t組資料,每組資料第一行讀入正整數n,接下來一行按順時針順序讀入序列a表示石塊的高度。

t行表示每組資料的答案。

1 5

1 2 4 5 3

40%,n<=200

60%,n<=2000

70%,n<=100000

80%,n<=1000000,1<=ai<=1000000

100%,n<=1000000,t<=5,1<=ai<=1000000000

codeforces5e

題目名選自《re:從零開始的異世界生活》第四章標題「永恆的契約」,本章講述了怠惰戰後,昴去迎接運往阿拉姆村的村民,卻得知聖域被結界封鎖,要完成試煉解放聖域的故事。

列舉任意兩塊石頭,然後暴力檢測是否可以互相看到。

複雜度n^3。

因為是乙個環,所以將其copy乙份變成兩倍長度來表示這個環。

如果i、j可以互相看到,那麼分情況考慮。

ai!=aj,假設ai>aj,那麼從j出發一直走ai是第乙個大於aj的,因此可以預處理left和right表示往左/右第乙個碰到的權值大於自己的,就可以檢驗i和j是否能互相看到。

ai=aj,同上,只不過是乙個碰到的權值大於自己的位置在i之後。

列舉任意兩塊石頭,用上述方法快速檢驗是否可以互相看到。

left和right可以用n^2的時間預處理。

因此總複雜度是n^2的。

根據60分演算法,容易知道對於ai!=aj的情況,很容易線性統計。

因此考慮ai=aj的情況,可以按照權值為第一關鍵字位置為第二關鍵字排序,那麼對於權值同為x的,後乙個能看到前乙個,那麼之前的就都能看到,便能線性統計。相鄰兩個能不能互相看到用60分演算法的方法檢驗。

但算上排序的時間,複雜度為n log n。

同時,我們顯然不能n^2處理left和right了,但可以用單調棧做到線性處理。

複雜度n log n。

權值範圍很小時,可以考慮使用桶排序。

複雜度為o(n)。

首先,我們注意到可以先刪除環上最大值(多個任取乙個),將環轉化為鏈,而且刪去後只會影響這個最大值和其他石頭產生的答案,不會影響其餘任意兩塊石頭間的可看見關係。 ai

的統計方法如60%一樣。

我們重新考慮ai=aj如何統計。假如對於

i<

j ,ai=aj,i和j能互相看到,則說明right[i]>j。因此對於每個位置可以維護乙個same[i]表示[i,right[i])中有多少個權值等於ai的,於是這種情況也可以線性統計。

最後不要忘記從首尾推一波,統計被刪去的最大值帶來的貢獻。

複雜度為o(n)。

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fd(i,a,b) for(i=a;i>=b;i--)

using

namespace

std;

typedef

long

long ll;

const

int maxn=1000000+10;

int a[maxn],b[maxn],left[maxn],right[maxn],same[maxn],sta[maxn];

bool bz[maxn];

int i,j,k,l,t,n,m,mx,top,ca;

ll ans;

int read()

return x;

}int main()

top=0;

fo(i,mx,n) b[++top]=a[i];

fo(i,1,mx-1) b[++top]=a[i];

fo(i,1,n) a[i]=b[i];

top=0;

sta[0]=0;

fo(i,2,n)

top=0;

sta[0]=n+1;

fd(i,n,2)

right[i]=sta[top];

sta[++top]=i;

}ans=0;

fo(i,2,n)

mx=0;

fo(i,2,n)

mx=0;

fd(i,n,2)

fo(i,2,n) ans+=bz[i];

printf("%lld\n",ans);

}}

100分:9人

70分:5人

60分:7人

40分:2人

0分:13人

平均分:48.61

本來打算給大家放水的,驗題人czl也說這是真noip難度。

然而事實上還是出難了,辣雞czl(霧

大家基本上還是做了挺久,沒想到題解法細節都挺麻煩,都做了1.5~3h,我的鍋……

模擬鍵盤的終極模擬2

2.全域性級模擬 你會發現,用上面的方法模擬按鍵並不是對所有程式都有效的,有的程式啊,你向它發了一大堆訊息,可是它卻一點反應也沒有。這是怎麼回事呢?這就要看具體的情況了,有些程式 特別是一些遊戲 出於某些原因,會禁止使用者對它使用模擬按鍵程式,這個怎麼實現呢?比如可以在程式中檢查一下,如果發現自己不...

模擬退火的兄弟 模擬上火

讓我們又來發一句 目前你能在這幾個地方看到 洛谷 眾所周知 有一種絕妙的演算法 sa 也就是模擬退火。它是解決tsp問題的比較優秀方法之一。它的解決方案是先定乙個極大的範圍,然後不斷縮小範圍。但是範圍實在是太大了,我們在這個巨大的範圍內浪費了很多時間。因此,優化的辦法 模擬上火,就來了。當然由於本人...

模擬撞擊 流體流動聲音的模擬

流體流動點的應聲是否也可以模擬呢?國外的小夥伴通過以計算流體力學為基礎找到了一種新的方法來合成液體聲音。液體產生的聲音主要是由於介質中氣泡的共振產生的。他們的方法是將基於物理的氣泡共振方程與實時淺水流體模擬以及基於sph網格的混合模擬進行耦合求解,以實現自動聲音合成。在 潰壩 模擬場景中,使用五種球...