日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj3170-[GDOI2013模拟4]挑选玩具【容斥,状态压缩,分治】

發(fā)布時(shí)間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jzoj3170-[GDOI2013模拟4]挑选玩具【容斥,状态压缩,分治】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題


題目大意

nnn個(gè)箱子放了若干個(gè)玩具,要求選擇一些箱子使得mmm種玩具都有,求方案總數(shù)。


解題思路

設(shè)fSf_SfS?表示選擇只有在集合為SSS的方案數(shù)。
然后答案考慮容斥,那么答案就是∑S(2(f(~S))?1)?(?1)∣S∣\sum_S (2^{(f_{(\sim S)})}-1)*(-1)^{|S|}S?(2(f(S)?)?1)?(?1)S
我們將集合的表示狀壓起來。
現(xiàn)在考慮如何快速求fff數(shù)組,首先fS=cSf_S=c_SfS?=cS?(cSc_ScS?表示集合是SSS的箱子個(gè)數(shù))。
然后分治,每次分治時(shí)rrr肯定是若干個(gè)111
比如當(dāng)l=0,r=11111l=0,r=11111l=0,r=11111時(shí)左邊邊都是0XXXX0XXXX0XXXX而右邊是1XXXX1XXXX1XXXX。也就是右邊是左邊第一位變成一。那么對(duì)于每個(gè)區(qū)間就有

fi=∑mfi?m+l?1(i>m)f_i=\sum_mf_{i-m+l-1}(i> m)fi?=m?fi?m+l?1?(i>m)

時(shí)間復(fù)雜度O(2mlog2m)O(2^m\ log\ 2^m)O(2m?log?2m)


codecodecode

#include<cstdio> using namespace std; const int M=(1<<20)+10,XJQ=1e9+7; int n,m,f[M],w[M],p[M],ans,v[M],MS; void apart(int l,int r) {if(l==r){f[l]=v[l];return; } int m=(l+r)>>1;apart(l,m);apart(m+1,r);for(int i=l;i<=m;i++)f[i+m-l+1]+=f[i]; } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int z=0,k;scanf("%d",&k);while(k--){int x;scanf("%d",&x);z|=(1<<x-1);}v[z]++;}MS=1<<m;for(int i=0;i<MS;i++)w[i]=w[i>>1]^(i&1);p[0]=1;for(int i=1;i<=n;i++)p[i]=(p[i-1]<<1)%XJQ;apart(0,MS-1);for(int i=0;i<MS;i++)(ans+=((w[i]?-1:1)*(p[f[MS-i-1]]-1)))%=XJQ;printf("%d",(ans+XJQ)%XJQ); }

總結(jié)

以上是生活随笔為你收集整理的jzoj3170-[GDOI2013模拟4]挑选玩具【容斥,状态压缩,分治】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。