当前位置: 首页 > news >正文

CF1572D

将每个人视为一个节点,可以一组的人连边

对于连边的两个人,他们的二进制中1的个数差为1,奇偶不同

所以这个图构成一个二分图,转化为二分图最大权匹配

而注意到,每选择一条边,有最多 \(2n-2\)条边不能选了,因此我们只需要保留边权最大的 \(2nk\) 条边即可

然后跑一个费用流即可

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
int count(int st){int sum=0;while(st)sum+=st&1,st>>=1;return sum;
}
int n,k,a[(1<<20)+5];
struct edge{int v,w,cst,nx;
}e[50005];
int cnt=1,hd[(1<<20)+15];
void add(int u,int v,int w,int c){e[++cnt]=edge{v,w,c,hd[u]};hd[u]=cnt;
}
void add_edge(int u,int v,int w,int c){
//	printf("%d %d %d %d\n",u,v,w,c);add(u,v,w,c);add(v,u,0,-c);
}
int s,t,tot;
priority_queue<pair<int,pii>,vector<pair<int,pii>>,greater<pair<int,pii>>> pq;
vector<int> nec;
int vst[(1<<20)+15];
int flow[(1<<20)+15],dist[(1<<20)+15],pre[(1<<20)+15];
bool vis[(1<<20)+15];
bool spfa(){for(int i:nec)dist[i]=0x3f3f3f3f,flow[i]=0,pre[i]=0;queue<int> q;q.push(s);vis[s]=1;flow[s]=0x3f3f3f3f;dist[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=hd[u];i;i=e[i].nx){int v=e[i].v;if(dist[v]<=dist[u]+e[i].cst || e[i].w<=0)continue;dist[v]=dist[u]+e[i].cst;flow[v]=min(flow[u],e[i].w);pre[v]=i;if(!vis[v])q.push(v),vis[v]=1;}}return dist[t]!=0x3f3f3f3f;
}
int solve(){int res=0;while(spfa()){res+=flow[t]*dist[t];int u=t;while(u!=s){int id=pre[u];e[id].w-=flow[t];e[id^1].w+=flow[t];u=e[id^1].v;}}return res;
}
int main(){scanf("%d%d",&n,&k);for(int i=0;i<(1<<n);i++)scanf("%d",&a[i]);for(int i=0;i<(1<<n);i++)for(int j=0;j<n;j++)if(i<(i^(1<<j))){pq.push(mp(a[i]+a[i^(1<<j)],mp(i,i^(1<<j))));tot++;if(tot>2*n*k)pq.pop(),tot--;}while(!pq.empty()){int u=pq.top().se.fi,v=pq.top().se.se,w=pq.top().fi;pq.pop();if(count(u)%2==1)swap(u,v);add_edge(u,v,1,-w);vst[u]=1;vst[v]=2;}s=(1<<20);t=(1<<20)+1;for(int i=0;i<(1<<n);i++)if(vst[i]==1)add_edge(t+1,i,1,0),nec.pb(i);else if(vst[i]==2)add_edge(i,t+2,1,0),nec.pb(i);add_edge(s,t+1,k,0);add_edge(t+2,t,k,0);nec.pb(s);nec.pb(t);nec.pb(t+1);nec.pb(t+2);printf("%d\n",-solve());return 0;
}
http://www.jsqmd.com/news/43857/

相关文章:

  • 信息论(七):对数似然比与相对熵(KL散度)
  • 纯CSS实现多种背景图案:渐变条纹、蓝图网格、波点与棋盘效果全解析(附 Sass Mixin 封装) - 指南
  • 2025年11月中走丝线切割机厂家推荐:深耕高精度/数控/极速中走丝线切割机速精密制造,实力厂家全揭秘!
  • 2025年云南/贵州/甘肃/西藏净化板源头厂家优选指南:中空玻镁/岩棉/硫氧镁净化板与洁净板实力厂家盘点!
  • 2025年11月东莞厂房装修服务商推荐:机械加工/仓储物流/恒温恒湿/无尘净化/重型设备厂房装修施工与设计优势!
  • 2025年11月艺术涂料核心厂家推荐:进口/意大利进口/意大利艺术漆—— 意式艺术与健康科技的融合典范
  • linux bios 设置
  • linux bin解压
  • 2025年11月新疆电线电缆厂家最新推荐,精准检测与稳定性能深度解析!
  • [GESP202406 三级] 寻找倍数
  • 2025 年 11 月新疆电线电缆厂家最新推荐,技术实力与市场口碑深度解析!
  • SQL进阶必备:从计算字段到多表联结,让查询效率翻倍!
  • 【Docker】[特殊字符] Docker 部署完全指南 - 从本地开发到云服务器 - 指南
  • Day42(12)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management
  • P14510 夜里亦始终想念着你 miss 题解
  • 2025年11月高温轴承工厂排行榜,高温轴承公司推荐,耐高温轴承供应厂家,耐高温轴承源头厂家-骄铭轴承
  • B4185 [中山市赛 2024/科大国创杯小学组 2023] 倍数子串/子串 题解
  • 20251117 - Manacher
  • Prufer序列和Cayley定理
  • 完整教程:PB级数据洪流下的抉择:从大数据架构师视角,深度解析时序数据库选型与性能优化(聚焦Apache IoTDB)
  • 软件工程学习日志2025.11.18
  • 11.14 事务的四大特性 并发事务问题
  • SQL逻辑查询语句执行顺序
  • 解码死锁的产生与解决
  • uniapp的rich-text在渲染长数字与长字母时不换行
  • 头部厂商易路AI HR实战解析:从人海战术到智能闭环的合规跃迁
  • 【微信小程序 + 登录流程】微信小程序授权登录完整流程,一篇搞定!(含代码实现) - 详解
  • linux auto
  • 记录相关的操作
  • P9846 [ICPC 2021 Nanjing R] Paimons Tree