題目鏈結
首先需要知道答案的性質
如果一段區間[l->r]可以成為答案,那麼他在答案中左面最近區間的右邊界r和右面最近區間左邊界l之間滿足
r+1->l-1之間的最大區間數=r+1->l-1之間的最大區間數+r+1->l-1之間的最大區間數+1
證明 :反證法,如果列舉的這一段區間裡有2個區間的話,r+1->l-1之間的最大區間數=r+1->l-1之間的最大區間數+r+1->l-1之間的最大區間數+2我們知道這個性質之後 只需要按字典序列舉每條邊判斷是否可以加入答案就好了
因此問題就轉化為如何求一段區間內的最大區間數
僅僅是對這個問題的話,很明顯的 如果有一段大區間裡包含一段小區間,為了最優答案那麼大區間就可以捨去。
因此我們建立了在a陣列的基礎上建立t陣列。
使用倍增即可在o(logn)時間內求出一段區間內最大的區間數(本質上是貪心思想,因為篩選出來的區間已經按右邊界排序)
根據第二問的解法,那麼第一問就不需要另外的做法了,直接求-inf~inf之間的最大區間數即可
#include
#include
#include
using
namespace std;
#define n 200010
#define inf 0x3f3f3f3f
int n,m;
int f[n][25
];int x[n]
,y[n]
;struct node
}t[n]
,a[n]
;sets;
intcalc
(int l,
int r)
intmain()
for(
int i=m;i>
0;i--
)for
(int j=
1;j<=
20;j++
) f[i]
[j]=f[f[i]
[j-1]]
[j-1];
cout<<
calc
(-inf,inf)
insert()
;s.insert()
;for
(int i=
1;i<=n;i++
)return0;
}
會議中心 APIO2009
會議中心 思路這一題的正解是倍增的,但是由於我太蒟蒻了,所以我選了乙個不算正解但是有可以拿滿分的題目學習 思路和我考場上其實差不多,只是我無法實現.下面我先來介紹幾個陣列的用途 1.s,s陣列代表的是列舉的i時,包括i區間在內最多有多少個區間 2.p陣列,p i 記錄的是在這一區間和這一區間之前,字...
P3627 APIO2009 搶掠計畫
題目描述 siruseri 城中的道路都是單向的。不同的道路由路口連線。按照法律的規定,在每個路口都設立了乙個 siruseri 銀行的 atm 取款機。令人奇怪的是,siruseri 的酒吧也都設在路口,雖然並不是每個路口都設有酒吧。banditji 計畫實施 siruseri 有史以來最驚天動地...
P3627 APIO2009 搶掠計畫
p3627 apio2009 搶掠計畫 tarjan縮點 最短 最長 路 顯然的縮點.在縮點時,順便維護每個強連通分量的總權值 縮完點按照慣例建個新圖 然後跑一遍spfa最長路,列舉每個有酒吧的點即可 但是我為什麼會搞dp呢.dp 81pts 這麼顯然的最長路,為什麼會搞dp呢.怕不是被dp題毒害了...