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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF1242C-Sum Balance【状压dp】

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF1242C-Sum Balance【状压dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/CF1242C


題目大意

給出kkk個集合,現在從每個集合中取出一個數再把這些數放進每個集合里各一個,求能否使得所有集合的和相等,求方案。

保證所有集合中的出現過的數字都互不相同。

1≤k≤15,1≤ni≤5000,?109≤ai,j≤1091\leq k\leq 15,1\leq n_i\leq 5000,-10^9\leq a_{i,j}\leq 10^91k15,1ni?5000,?109ai,j?109


解題思路

顯然的突破口肯定是數字互不相同。

首先和不變所以每個集合的最后的和應該都是知道的記為sumsumsum,記第iii個集合的和為sis_isi?

考慮每個交換都是類似一個環形的結構,設bbb傳給aaa,記傳出的數字為xbx_bxb?xax_axa?,那么有
sa?xa+xb=sum→xb=sum?sa+xas_a-x_a+x_b=sum\rightarrow x_b=sum-s_a+x_asa??xa?+xb?=sumxb?=sum?sa?+xa?
因為互不相同,每個數字看成一個點,那么數字xax_axa?連接的就是sum?sa+xasum-s_a+x_asum?sa?+xa?

然后暴力找出所有沒有經過重復集合數字的環,記錄rSr_SrS?表示集合SSS的環的起點。

然后設fSf_SfS?表示能否拼出集合SSS,然后O(3k)O(3^k)O(3k)轉移即可。

時間復雜度:O(k∑n+3k)O(k\sum n+3^k)O(kn+3k)


code

#include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll long long #define mp(x,y) make_pair(x,y) using namespace std; const ll K=16; ll k,sum,s[K],f[1<<(K-1)],r[1<<(K-1)]; map<ll,ll> v;pair<ll,ll> ans[K]; void solve(ll S){if(!S)return;ll x=r[f[S]]-1e9-1;ll y=x,q=v[x];do{y+=sum-s[q];ans[v[y]]=mp(y,q);q=v[y];}while(y!=x);solve(S^f[S]);return; } signed main() {scanf("%lld",&k);for(ll i=1;i<=k;i++){ll m;scanf("%lld",&m);for(ll j=1,x;j<=m;j++)scanf("%lld",&x),s[i]+=x,v[x]=i;sum+=s[i];}if(sum%k!=0)return puts("No")&0;sum/=k;map<ll,ll>::iterator it=v.begin();while(it!=v.end()){ll x=(*it).first,p=(*it).second;ll S=0,q=p,y=x,flag=1;do{if(!q||(S>>q-1)&1){flag=0;break;}S|=(1<<q-1);y+=sum-s[q];q=v[y];}while(y!=x);if(flag)r[S]=x+1e9+1;++it;}ll MS=(1<<k);f[0]=-1;for(ll s=0;s<MS;s++){for(ll t=s;t;t=(t-1)&s)if(f[s^t]!=0&&r[t]){f[s]=t;break;}}if(!f[MS-1])return puts("No")&0;puts("Yes");solve(MS-1);for(ll i=1;i<=k;i++)printf("%lld %lld\n",ans[i].first,ans[i].second);return 0; }

總結

以上是生活随笔為你收集整理的CF1242C-Sum Balance【状压dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。