看到求第k大,k很小,首先應該想到k路歸併。
利用可持久化可並堆進行dp
g[i][j]表示前i個素數,用了j個質因子可以表示的數的集合
g[i][j]=sigma(g[i-1][j-k]*p[i]^k) sigma表示集合的並,乘法用打標記實現。
然後k路歸併,按照使用了的質因子個數分類。
令mx[j]表示取j個質因子的情況下可以取得最大素數
用堆維護g[mx[j]][j]的最大值,每次出堆後在對應的可並堆裡刪除這個值,並把新的最大值加入全域性堆。
另,可持久化可並堆的寫法:
(1)在merge的時候要新建節點
(2)在release的時候,i不用新建節點,但是i的左右兒子都要新建節點。
實測陣列大小開1.7*10^7
#include
#include
#include
#include
#include
#define
ll long
long
#define
inf
1e9
#define
eps
1e-8
#define
md
using
namespace
std;
struct
qq ;
struct
cmp
};
priority_queue
vector
<
qq>,
cmp>
q;
struct
trtr
[17000010
];
int
dis[
17000010],f
[32][100],g
[32][100
],mx
[100
];
intss[
32]=;
int
cnt;
int
new(
intx
,ll d
)
void
release
(int
i)
}
int
merge
(intx,
inty
)
int
main
()
;q.
push
));
for(
inti=1
;i<=31;
i++)
}
for(
intj=1
;mx[j
];j++)q
.push
));
ll ans=0
;
for(
inti=1
;i<=k;
i++)
);
}
printf
("%lld\n"
,ans
);// printf("%d\n",cnt);
return
0;
}
BZOJ 4524 Cqoi2016 偽光滑數
和d1的k遠點對類似的k優解求法 首先找到乙個集合使得當前最優解一定在其中 然後每次找到最優解並把與它有關且 必定 劣於它的加到集合裡去 重複k 1次 對於這道題顯然一開始的集合就是pi j,pi為質數且pi 128,pi j n 然後每次擴充套件就是把乙個數中的其中乙個質因數變小一點 當然還要ha...
bzoj 4524 Cqoi2016 偽光滑數
若乙個大於1的整數m的質因數分解有k項,其最大的質因子為ak,並且滿足ak k n,ak 128,我們就稱整數m為n 偽光滑數。現在給出n,求所有整數中,第k大的n 偽光滑數。這種問題首先發現乙個數是否是偽光滑數隻跟它的最大的質因子和分解後的項數有關,而只有31種質因子,所以總共的類別是有限的 把最...
bzoj4524 CQOI2016 偽光滑數
time limit 10 secmemory limit 512 mb若乙個大於r的整數j的質因數分解有f項,其最大的質因子為ak,並且滿足ak k n,ak 128,我們就稱整數j為n 偽光滑數。現在給出l,求所有整數中,第e大的n 偽光滑數。只有一行,為用空格隔開的整數l和e。2 n 10 1...