和字典序有關的題型啊。
對於乙個給定的s=,若有p=,滿足(x1 < x2 < … < xm)且(ax1 < ax2 < … < axm)。那麼就稱p為s的乙個上公升序列。如果有多個p滿足條件,那麼我們想求字典序最小的那個。任務給出s序列,給出若干詢問。對於第i個詢問,求出長度為li的上公升序列,如有多個,求出字典序最小的那個(即首先x1最小,如果不唯一,再看x2最小……),如果不存在長度為li的上公升序列,則列印impossible.
第一行乙個n,表示序列一共有n個元素第二行n個數,為a1,a2,…,an 第三行乙個m,表示詢問次數。下面接m行每行乙個數l,表示要詢問長度為l的上公升序列。
對於每個詢問,如果對應的序列存在,則輸出,否則列印impossible。
63 4 1 2 3 636
45impossible
1 2 3 6
impossible
n<=10000,m<=1000。
看到字典序和上公升子串行dp,小c想起了apio2009的那道convention。
(不要吐槽小c的做題順序)
既然要取字典序最小的,那肯定就是從小的取起,能取就取。
那什麼情況算是能取的呢?
設要取的上公升序列長度為len,已經取了x個數,且最後乙個數大小為last。
設我們當前要取的數的位置為i,數的大小為a[i],以這個位置開頭的最長上公升子串行長度為d[i]。
那麼如果a[i]>last且d[i]+x>=len那麼i這個位置的數就能取,也就是必須取。
我們來分析為什麼這兩個條件可以決定這個數取不取。
a[i]>last是上公升序列的必要條件,我們已經滿足了last必須取,且上乙個取last一定能構造出答案,所以從字典序最小的角度來說,我們不能用a[i]來替換last。
d[i]+x>=len則是能構造出長度為len的答案的充分條件,因為d[i]滿足二分性,如果d[i]>=len-x,那麼一定存在乙個以a[i]開頭長度為len-x的上公升序列接在last後面,從字典序最小的角度來說,我們取它顯然最優。
剩下就是求d[i]了嘛。求最長上公升子串行誰不會啊?
其實是正常的字典序也好,還是這題的逗比字典序也好,用以上的思路都是可以做的。
時間複雜度o(nlogn+n*m)。
#include #include#include
#include
#define mn 10005
#define mm 1005
using
namespace
std;
struct megb[mm];
int f[mn],a[mn],p[mn],lb[mm],ans[mm][mn],t[mn<<2
];int
nin,n,m,mq;
inline
intread()
while (c>='
0' && c<='
9')
return n*f;
}void dfs(int depth,int x,int l,int r,int
ps)
if (mx==r) break
; }
}}inline
void getad(int x,int z)
inline
int getmx(int l,int
r)
return
lt;}
bool cmp(const meg& a,const meg& b)
intmain()
printf("%d
",p[ans[i][1
]]);
for (j=2;ans[i][j];++j) printf("
%d",p[ans[i][j]]); puts(""
); }
}
不知道為什麼突然想把詢問排序然後一起做想降低常數,不過常數好像更大了233。
因為看錯字典序的緣故,小c的**畫風有點崩壞……(其實本來就很崩)
BZOJ 1046 上公升序列(DP)
time limit 10 sec memory limit 162 mb submit 4898 solved 1704 submit status discuss 對於乙個給定的s 若有p 滿足 x1 x2 xm 且 ax1 ax 2 axm 那麼就稱p為s的乙個上公升序列。如果有多個p滿足條件...
BZOJ1046 上公升序列(動態規劃,貪心)
bzoj 洛谷我一開始看錯題了,一度以為是字典序最小的序列。最後發現它要求的字典序是位置的字典序最小。那就很好辦了。設f i f i 表示以 i i 開頭的li s role presentation lis lis長度,用bi t bit 轉移。然後每次詢問暴力貪心即可。include inclu...
BZOJ 1046 HAOI 上公升序列
1046 haoi2007 上公升序列 time limit 10 sec memory limit 162 mbsubmit 5376 solved 1862 submit status discuss description 對於乙個給定的s 若有p 滿足 x1 x2 xm 且 ax1 2 出s...