ARC098 補一發題解

2021-08-20 08:06:46 字數 3449 閱讀 1207

週六晚上打比賽

然後手速(其實是腦速)賊慢的切了c/d

然後e寫了乙個n2

log n

2log

,線段樹老是wa也是夠了

然後f就gg了,不過這題確實很巧me估計me想出來考試早結束了

傳送門乙個zz題

列舉那個位置作為中間點,左邊朝左的需要轉向,右邊朝右的需要轉向

搞個字首和 / 字尾和,然後掃一遍

#include 

#include

#include

using

namespace

std ;

int pre[300005] , suf[300005] , len ;

char a[300005] ;

template

< typename t >

void smin( t &x , t y )

int main()

傳送門

對於每個數字,都只有至多乙個數字擁有,才能統計入答案

顯然是有單調性的乙個玩意,所以two pointer掃一掃就好了

#include 

#include

#include

using

namespace

std ;

int n , a[200005] ;

void solve() printf( "%lld" , ans ) ;

}int main()

傳送門

這個資料範圍很小,然而並沒有什麼好的dp做法,於是考慮從答案入手

當我們固定了小端的數字時,顯然希望最大的被刪掉的數字盡量小

因為這個東西不容易二分,所以直接列舉刪除最小的是哪乙個,然後check

假設最小能被刪掉的是

u u

,那麼把小於

u' role="presentation" style="position: relative;">u

u的數字都看成斷點,然後從小到大列舉數字看可不可以刪除,只要存在乙個區間包含當前數字且不經過斷點就好了。然後me就直接上了線段樹…(記錄一下每個斷點,查詢當前數字所在區間數字總個數是否夠

k k

個)當然也可以直接把所有區間取出來,然後把可以刪掉的數字拿出來排個序得到答案。

出題人說這題資料範圍可以出到 105

' role="presentation" style="position: relative;">10510

5,並且說:this part is left as an exercise for readers

然而me還沒有去想

#include 

#include

#include

using

namespace

std ;

bool ban[2005] ;

int n , k , q , a[2005] , rk[2005] , sa[2005] ;

int pre[2005] , nxt[2005] ;

struct node *root , w[4005] , *tw = w ;

template

< typename t > void smin( t &x , t y )

bool cmp( const

int &a , const

int &b )

node *build( short lf , short rg ) return nd ;

}void reset( node *nd , short lf , short rg ) else nd->sum = !ban[lf] ;

}short query( node *nd , short lf , short rg , short l , short r )

void set_zero( node *nd , short lf , short rg , short pos )

void prework()

void solve()

} if( cnt != q ) break ;

smin( ans , a[ sa[ed] ] - a[ sa[st] ] ) ;

for( int j = 1 ; j <= i ; j ++ ) ban[ sa[j] ] = false ;

} printf( "%d" , ans ) ;

}int main()

傳送門

這個題,有一種很熟悉的感覺

就是類似這種題:去打怪,打死第

i i

只怪 先消耗 ai

' role="presentation" style="position: relative;">aia

i點生命值,然後再補回 bi

b

i點生命值,問最少需要多少血

上面那道題,顯然是先打回血的怪,再打掉消耗大的怪

先打一次性消耗大的怪(不計回血)的原因是,如果先打那種回血較多的怪,血量就會被慢慢消耗以至於無法打死大怪

然後看這道題,是類似的。顯然小於b的a是無用的,所以先把所有小於b的a全部換成b

然後,答案至少得是 ∑i

bi∑ ib

i,要在這個基礎上增加來滿足

a a

的限制

然後根據上一題得到的經驗,我們想優先選擇 a−

b' role="presentation" style="position: relative;">a−b

a−b大的,因為如果選了太多 a−

b a−b

小的點之後,可能就無法滿足某些點的

a a

的限制了(這種情況會發生在那些

a' role="presentation" style="position: relative;">a

a很大,而且 a−

b a−b

也很大的點上)

但是這種策略還存在乙個問題,就是萬一我選了這個點,然後把圖分成了幾塊,這樣就導致如果我先選這個點,以後還得經過這個點且需要滿足

a a

的限制,這顯然是不優秀的。那麼對於這種點,我們肯定是先把所有其它連通塊填完了,只剩下最後某乙個連通塊,把這個割點搞了之後,就進入最後的那個連通塊,把它填了,顯然這樣是不劣的

所以我們現在有了乙個策略:對於不是割點的點,按照 a−

b' role="presentation" style="position: relative;">a−b

a−b從小到大挨個挨個填,對於割點特殊考慮(列舉填到最後剩下的乙個,選最優策略)

然後這個步驟,實際上就是按照 a−

b a−b

從小到大排序建樹的過程,葉子結點的值最小,根權值最大,然後直接在樹上dp就可以了

**me還沒有寫,不過可以參考這個:傳送門,感覺邏輯比較清晰

ARC 學習筆記(一)

arc,顧名思義,automatic reference count,也就是自動引用計數。它是相對mrc 手動引用計數 而言的。當時不管是arc還是mrc,都應該嚴格遵守objective c記憶體管理的基本原則 strong修飾符 strong修飾符是預設的修飾符。這樣不管是alloc new c...

補一下部落格

其實這是前幾天的工作了,一直沒有寫部落格,現在來補一下。上一次是把數獨的檢查工作做了,但是數獨生成方法一直沒有好的想法,也看了幾篇部落格,但是都不大好,有點的是不好解決重複的問題,有的是不好生成百萬數量規模的生成方法。但是前幾天再看時,第一篇搜到的部落格就是針對百萬資料規模的數獨生成方法,貌似與我們...

Hibernate一級快取(補)

siwuxie095 什麼是快取 快取是介於 應用程式和永久性資料儲存源 如 硬碟上的檔案 或資料庫 之間,其作用是降低應用程式直接讀寫永久性資料儲存源的頻率,從而提 高應用的執行效能 針對資料庫,則 資料是存到資料庫中的,而資料庫本身也是檔案系統,使用流方式操作文 件的效率並不是很高 如果把資料存...