P3626 APIO2009 會議中心

2021-10-23 06:18:54 字數 1238 閱讀 3801

題目鏈結

首先需要知道答案的性質

如果一段區間[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題毒害了...