bzoj 2244 SDOI2011 攔截飛彈

2022-05-31 06:36:09 字數 1865 閱讀 5473

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度、並且能夠攔截任意速度的飛彈,但是以後每一發炮彈都不能高於前一發的高度,其攔截的飛彈的飛行速度也不能大於前一發。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。

在不能攔截所有的飛彈的情況下,我們當然要選擇使國家損失最小、也就是攔截飛彈的數量最多的方案。但是攔截飛彈數量的最多的方案有可能有多個,如果有多個最優方案,那麼我們會隨機選取乙個作為最終的攔截飛彈行動藍圖。

我方間諜已經獲取了所有敵軍飛彈的高度和速度,你的任務是計算出在執行上述決策時,每枚飛彈被攔截掉的概率。

正解:cdq+dp

這題顯然是乙個三維偏序,考慮cdq優化dp:

偏序為:\(ix[j],y[i]>y[j]\)

首先我們按正常cdq的套路分治 \(x\)

考慮 \(mid\) 左邊對右邊的影響

我們將 \(x\)按從大到小排序,按歸併排序的方法每一次將左邊的大於右邊當前 \(y\) 的加入,以 \(y\) 為下標建立樹狀陣列,那麼大於當前 \(y\) 的都是可以轉移到的,訪問樹狀陣列找出最大值即可

對於第二問:

\(i\) 被攔截的概率是 \(i\) 出現在的方案數目/方案總數,那麼我們在維護第一問最大值時,也要順便維護滿足最大值的方案數,如何判斷 \(i\) 是否在最優方案中?

我們正反各做一邊第一問的dp,答案分別為\(f1,f2\),如果\(f1+f2-1==ans\)即滿足條件,將 \(f1,f2\) 對應的方案相乘即可

注意:cdq分治優化dp時,分治順序要稍作調整,具體為:求出左邊答案,拿左邊更新完右邊後再分治右邊

tips:這題方案數是可以爆long long的,注意開double存方案

#include #include #include #include #include #include #define rg register

#define il inline

#define iter iterator

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

typedef long long ll;

const int n=50005;

int n,b[n],num=0,tot;

struct nodea[n];

bool compx(node i,node j)

bool compi(node i,node j)

else if(to==tr[i].x)tr[i].s+=fa;

}}il bit qry(int sta)

il void clear(int sta)

il void solve(int l,int r,bool t)

else

else if(tmp.x+1==f[t][j])g[t][j]+=tmp.s;}}

while(xr<=r)

else if(tmp.x+1==f[t][j])g[t][j]+=tmp.s;

}for(int i=l;i<=mid;i++)clear(tot-a[i].y+1);

sort(a+l,a+r+1,compi);

solve(mid+1,r,t);

}void work()

else if(ans==f[0][i])maxlen+=g[0][i];

}printf("%d\n",ans);

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

}int main()

SDOI2011 BZOJ2244 攔截飛彈

description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度 並且能夠攔截任意速度的飛彈,但是以後每一發炮彈都不能高於前一發的高度,其攔截的飛彈的飛行速度也不能大於前一發。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還...

Bzoj2244 SDOI2011 攔截飛彈

傳送門 每個飛彈有時間,高度,速度 求時間遞增,高度,速度不降的最長的序列 然後還要求最長序列的方案以及每個飛彈在最長序列中的方案 這個就是偏序問題辣,正反兩遍求出每個飛彈為結尾開頭的序列最長長度 判斷是否在最長序列就二者相加判斷 然後記錄下方案,用do uble d ou bl e,lo nglo...

bzoj2244 SDOI2011 攔截飛彈

cdq。還真是。一開始自己寫,設f i 為以i結尾的最優方案,fn i 為以i結尾的最優方案數,然後cdq完了第一問就出來了,還順便把總最優方案數算了,and then?mengbier 然後各路 啊,乙個下午 一晚上就交代了 怎麼做呢?我們再cdq出另乙個f和fn表示以i開頭的最優方案和方案數 然...