LOJ2391 港口設施

2021-10-06 05:54:20 字數 2535 閱讀 4291

題目傳送門

題目描述

題目譯自 joisc 2017 day1 t2「港灣裝置 / port facility」

joi 港口雖然很小,卻非常繁忙。

joi 港口放置貨櫃的結構可視為兩個本質不同的棧。每天從船上卸下的貨櫃會被壓入某個棧,而被運出港口的貨櫃則從棧頂彈出。

今天 joi 港口會迎來 個貨櫃,它們在今天內會被運出港口。今天出入口有 條記錄,每條記錄都表示乙個貨櫃到港或離港。

第 個貨櫃 的到港記錄為 ,離港記錄為 。

我們把 個貨櫃分別放在哪個棧稱為乙個方案。求放置貨櫃的方案數 。

輸入格式

第一行有乙個整數 。 在接下來的 行中,第 行 有兩個整數 ,用空格分隔。

輸出格式

乙個整數,表示放置貨櫃的方案數 。

樣例

樣例輸入 1

4

1 32 5

4 86 7

樣例輸出 1

4
樣例說明 1為了方便敘述,將這兩個棧分別稱為 a 和 b 。

四種方案分別為:abaa(第 個貨櫃放在 a,第 個貨櫃放在 b,以此類推),abab,baba,babb。

首先我們根據樣例1畫出

分析

觀察上圖,我們可以發現,當兩個箱子進入港口和離開港口的區間向交叉(並不包含),則他們必定是不能存在同乙個棧內的,因為這樣無法實現所要求的出入棧順序(仔細思考一下)。

於是我們可以將符合這個條件的兩個箱子都連起來,表示這兩個箱子必須分開。這不就是二分圖嗎?那我們就由此建立二分圖:

我們發現這個二分圖種有兩個連通塊,每個連通塊都有兩種染色方案(如1-2-3可以染成a-b-a或者b-a-b),因此這個二分圖總的染色方案有2^2種,即箱子有4種放置方案。

解體思路

先對符合要求的點進行連邊,再進行染色,如果不是二分圖,則不符合要求直接輸出0;若是二分圖,計算二分圖內連通塊的數量n,答案即為2^n。

**

#include

using namespace std;

#define ll long long

const

int n=

10000005

;const

int mod=

1e9+7;

vector<

int> e[n]

;//存邊

int col[n]

;//各箱子顏色

int nxt[n]

,fa[n]

,le[n]

,id[n<<1]

,a[n]

,cnt;

//nxt和fa用於防止重複連邊 篩去包含的情況

int n;

//le表示箱子到達位置,a存到達順序

ll ans=1;

//id存各個時刻進入或出去的箱子

//可以對每個維護乙個nxt表示向右最大的同色的位置

//從左往右用並查集維護

voidqm(

int a,

int b)

//快速冪

}inline

intfind

(int x)

inline

void

addedge

(int u,

int v)

intdfs

(int u)

}return1;

}int

main()

for(

int i=

1;i<=n;i++

)nxt[i]

=i,fa[i]

=i;//初始化nxt fa

fa[n+1]

=n+1

;for

(int i=

1;i<=

2*n;i++)}

int cnt=0;

memset

(col,0,

sizeof

(col));

for(

int i=

1;i<=n;i++

)//對各連通塊染色

if(col[i]==0

)}qm(

2,cnt)

; cout<

return0;

}

239 最大滑動視窗

滑動視窗當中的最大值 掃瞄正個陣列,o n 每個節點處需要進行掃瞄k個節點,所有時間複雜度為o nk class solution return result private void helper int nums,int start,int end,int result,int i result...

leetcode 滑動視窗最大 (239)

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大...

leetcode刷題筆記239

這是一道hard的題目,但是我覺得沒有想象的那麼難,大概在中等難度,主要是要搞清楚一些東西,譬如優先順序佇列等,還有一點比較重要的需要搞清楚,我會在下邊提及,這道題不僅僅是讓我學到演算法,也讓我重視起對於stl的使用。給你乙個整數陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的...