SDOI2011 攔截飛彈

2022-03-27 07:33:06 字數 1282 閱讀 4875

這道題是真的蛇皮

方案數要開\(double\)真的蛇皮

首先\(dp\)是非常容易看出來的

設\(dp[i]\)表示以\(i\)結尾的最長子序列

顯然轉移方程為

\[dp[i]=max(dp[j]+1)(j=h[i],v[j]>=v[i])

\]暴力轉移是\(o(n^2)\)的

同時第二問我們還需要求乙個概率

非常簡單,我們反正做一遍\(dp\),看看\(i\)之後能連線的最長子串行為多少

同時統計好兩邊的方案數,之後如果左右兩邊的長度拼起來等於最長的長度,那麼就可以存在在答案裡,於是概率就是\(\frac\times\text}}\)

之後核心就是求出方案數和子串行長度了

發現這就是乙個三維偏序的問題,我們可以直接硬上\(cdq\)分治

但是像板子裡寫的那樣的\(cdq\)是不行的,板子裡的\(cdq\)本質上後根遍歷,所以用左邊更新右邊的時候\(dp\)陣列並不能被更新全

於是略改一下板子,改成中根遍歷,先處理左邊,之後用左邊的來更新右邊的\(dp\)值,之後處理右邊

這樣就能夠保證每乙個位置被更新的時候其前面的位置都已經被更新了

**

#include#include#include#include#define re register

#define maxn 50005

#define lowbit(x) ((x)&(-x))

#define ll double

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

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

inline int read()

int h[maxn],hh[maxn];

int v[maxn],to[maxn];

int n,tot;

int lf[maxn],rf[maxn];

ll ld[maxn],rd[maxn];

inline int find(int x)

return 0;

}struct node

a[maxn];

inline int cmp(node a,node b)

j++;}}

while(j<=t)

j++;

}for(re int k=s;kstd::sort(a+mid+1,a+t+1,cop);

cdq(mid+1,t);

}int main()

return 0;

}

SDOI2011 攔截飛彈

點此看題 設f i f i f i 為以i ii點結束的最長不降子串行個數,可以cdq cdqcd q分治,遞迴的時候我們已經處理出了 l,mid l,mid l,mid 的ff f值,我們要拿他去更新 mi d 1,r mid 1,r mid 1 r 的f ff值,需要滿足hi hj,v i vj...

SDOI2011 飛彈攔截 題解

論printf lf 0.0 的重要性 給你nn 個三維的點 x,y,z x,y z 求出最長的三維不下降序列,並輸出每乙個點在最長的序列上的概率。這個肯定和普通的飛彈攔截不同了,普通的是沒有速度的,也就是二維的,且時間一維已經有序,那麼對高度求乙個lis lis 最長不下降序列 就好了。但是現在還...

SDOI2011 BZOJ2244 攔截飛彈

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