分段雜湊 H Paint the Wall

2022-08-18 00:06:10 字數 1590 閱讀 1817

【題意】

在乙個長為h,寬為w的白牆上選乙個矩形區域塗顏色,後塗的顏色會覆蓋先塗的,題目給出n(n<=100)個矩形區域和對應的顏色。

求最後牆上每種顏色的面積是多少,共有多少種顏色。

【思路】

將牆分成一塊一塊的矩形區域,對每個區域判斷最後塗的顏色是什麼,將其面積加到對應的顏色上。關鍵是怎樣將矩形分塊:

將豎線(所有矩形的left和right)離散化,從左到右列舉相鄰的豎線;

對固定的兩條豎線,列舉覆蓋這兩條豎線的矩形,再離散化橫線(所有合法矩形的top和bottom);

對當前的每個矩形區域,遍歷所有的合法矩形,判斷哪個是最後塗的。

時間複雜度是o(2n*2n*n)即o(n^3)。

【accepted】

1 #include2 #include3 #include4 #include

5 #include6 #include7

8using

namespace

std;

9int

h,w;

10int

n;11

const

int maxn=4e2+5;12

intcnt;

13struct

rec14

21 }rec[maxn/2

];22

intarea[maxn];

23 vectorv;

24int

w[maxn];

25int

h[maxn];

26void

init()

2731

intmain()

3240

init();

41 scanf("

%d",&n);

42for(int i=1;i<=n;i++)

4348

getchar();

49 sort(w+1,w+cnt+1

);50 cnt=unique(w+1,w+cnt+1)-(w+1

);51

for(int i=1;i)

5263

}64 sort(h+1,h+tot+1

);65 tot=unique(h+1,h+tot+1)-(h+1

);66

int sz=v.size();

67for(int k=1;k)

6878}79

}80if(pos!=-1)81

84}85}

86if

(cas)

8790 printf("

case %d:\n

",++cas);

91int ans=0;92

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

9399

}

100if(ans==1

)101

104else

105

108}

109return0;

110 }

view code

在基於雜湊的Map中使用鎖分段技術

1 降低鎖競爭的程度 減少鎖的持有時間,降低鎖的請求頻率,使用帶有協調機制的獨佔鎖。縮小加鎖 的範圍 縮小鎖的粒度,對相互對立的共享變數使用不同的鎖 對單個鎖分解為兩個鎖,到分解為多個鎖的鎖分段,使同一時刻可以讓更多執行緒同時操作不同分段鎖鎖定的分段。2 基於雜湊的map實現,其中使用了鎖分段技術。...

分段dp(分段動態規劃)

基本分析 這題看似我們可以用區間dp的方式,將資料分左部分,右部分,然後用加號或乘號連線起來,但此時的問題就是每部分允許有多少乘號,這個又得列舉。所以這樣的方法可做,但複雜度要變成o n3 m2 那麼對於這類分區間時,又對區間內運算元量有限制的dp,我們可以用分段dp的方式,用dp i j 表示前i...

雜湊雜湊雜湊雜湊

雜湊,是解決字串 實際上是各種類 問題的重要工具,講字串儲存讀取速度降低到了線性,雜湊的用法十分豐富,可以用了進行狀態壓縮等。include include include includeusing namespace std 這與jdk string.hashcode 的函式在足夠大的資料下失配率...