飛盤比賽(入門oj Problem 5961)

2021-09-30 19:41:05 字數 2006 閱讀 2123

飛盤比賽(入門oj problem 5961)

第1次發布題解,怪不好意思的。。。

我是乙個蒟蒻,有什麼不對的請各位神犇指教一番,不勝感激。

那就進入正題:

題目描述:

每天, cici 的n(1 <= n <= 50,000)頭學生排成一行. 有一天, cici 決定讓一些學生們玩一場飛盤比賽. 他準備找一群在對列中為置連續的學生來進行比賽. 但是為了避免比賽沒有懸念,學生的身高不應該相差太大. cici 準備了q (1 <= q <= 180,000) 個可能的學生的選擇和所有學生的身高 (1 <= 身高 <= 1,000,000). 他想知道每一組裡面最高和最低的學生的身高差別.

輸入

輸出

樣例輸入

6 3173

4251 5

4 62 2

樣例輸出63

0剛開始看到這題目的時候覺得巨水,想用*****的思想直接把這題暴力過,結果應該顯而易見,就是一臉茫然tle。實際上這題應該要用乙個叫做rmq的高階東西,那麼什麼叫做rmq呢,接下來我給簡單地普及一下。

目的事實上來說,rmq的目的不難理解,就是不斷的去訪問乙個區間的最值(最大值或最小值),由於訪問次數過多(比方說1000000次),時間複雜度或空間複雜度均過高的樸素(搜尋)演算法不適於我們使用,這一簡單而又強大的功能,究竟是怎麼實現的?

思想rmq的思想就是倍增的思想,類似於分治和遞迴,將一組資料看成乙個整體,實質上是對這個整體分解成若干個簡單的子問題解決。例如求100個數之間的最大值,可以將其轉換為求前50個數的最大值與後50個數的最大值,再進行比較;而這兩個子問題又可以轉換為求4組25個數區間的最大值…以此類推,最後會轉換為求100組1個數之間的最大值,這時候不僅最大值是這個數本身,最小值也是這個數本身。相對來說就從o(n)的時間複雜度將至了o(logn)。

實現第2點中提到的思想有很多的實現方法,有一種方法是定義乙個陣列f[i][j],表示從i到j的最大值(最小值),但一旦整體過大就會陣列越界且無法擴大。所以我們就需要定義乙個陣列f[i][j],表示從i出發向後移動2j(j≠0)步,這樣空間複雜度也會大大減少,那麼為什麼是2j步,原因是2j的因子只含2,無論怎樣都會把問題一分為二,在c++有利於**的編寫且可以利用位運算(因為位運算採用的是二進位制),即為:

f[i][j]=max(f[i][j-1],f[i+(1<

位運算這個高階操作本蒟蒻最初是從某位神犇那了解到的(各位成員若有疑問可詢問神犇,畢竟我懂的少些),在我們rmq中要用到的是<

那麼我們就不難得出:

f[i][j]=f[i+(1<

實際問題

實際上我們在求[a,b](b≥a)這段區間的最值時,區間的元素個數(即b-a+1)不一定能剛被2n所表示,那麼這個時候我們應該求出乙個小於且最接近於b-a+1並能剛好被2n表示的數,隨後把它分解為兩段處理,兩段之間會有重複,但不影響最後答案。於是我們能得出:

這個數就是t且t=log(b-a+1)/log(2),我們還可以得到:

maxn=max(f[i][t],f[b-(1這樣就達到了我們最終的目的,且陣列被壓縮成了f[n][logn]。

**(寫得很醜請見諒)

#include #include using namespace std;

int n,q,a,x,y;

int mx[50001][16],mn[50001][16];

void work()

{ int t=log(n)/log(2);

for(int i=1;i<=t;i++)

{ for(int j=n;j>=1;j--)

{ if (j+(1<望得到各位神犇的指教。

比賽 DP入門

題目描述 你在打比賽,這場比賽總共有12個題 對於第i個題,你的隊伍有a i 的機率解決她 如果解決不了她呢?由於所有人討論的都很大聲 所以你有b i 的概率從左邊那個隊那裡聽會這個題的做法 有c i 的概率從右邊那個隊那裡聽會這個題的做法 請問最終你們隊伍解出0 12題的概率分別是多少 輸入描述 ...

Kaggle比賽入門指南

首先說,絕大部分的kaggle比賽是data mining dm 比賽 除少數是和discrete optimization還有computer vision cv 有關 最重要的是和machine learning ml 關係不大。這是很多人乙個誤區,往往希望在kaggle上學到很多ml的知識。k...

杭電 1285 確定比賽名次 拓撲排序入門

傳送門 拓撲排序 按某種順序輸出沒有前驅的點。思路 題目即要求按字典序拓撲排序。ac include include includeusing namespace std int n int par 505 前驅 int ans 505 記錄答案 bool chart 505 505 記錄兩人是否進...