題目傳送門
題目描述
題目譯自 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 的滑動視窗從陣列的最左側移動到陣列的...