当前位置: 首页 > 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.gsyq.cn/news/53393.html

相关文章:

  • CF183C Cyclic Coloring
  • 2025年云南/贵州/甘肃/西藏净化板源头厂家优选指南:中空玻镁/岩棉/硫氧镁净化板与洁净板实力厂家盘点!
  • 2025年11月艺术涂料核心厂家推荐:进口/意大利进口/意大利艺术漆—— 意式艺术与健康科技的融合典范
  • SQL进阶必备:从计算字段到多表联结,让查询效率翻倍!
  • C# 中容易出错的问题
  • 2025年11月高温轴承工厂排行榜,高温轴承公司推荐,耐高温轴承供应厂家,耐高温轴承源头厂家-骄铭轴承
  • 完整教程:PB级数据洪流下的抉择:从大数据架构师视角,深度解析时序数据库选型与性能优化(聚焦Apache IoTDB)
  • 【微信小程序 + 登录流程】微信小程序授权登录完整流程,一篇搞定!(含代码实现) - 详解
  • linux auto
  • 记录相关的操作
  • 不同方向的箭头符号
  • Elasticsearch 7.17 集群添加账号密码
  • 11.13 表子查询 内连接补充 事务
  • 深入解析:推荐给硬件工程师的技术书籍
  • 全球可观测厂商怎么选?2025年可观测性平台深度分析
  • 2025 ICPC 沈阳区域赛 游记
  • 在树莓派中配置X11桌面的HDMI配置
  • 2025 最新移动厕所源头厂家推荐:千台设备储备 + 全国服务网点,国际测评认证优质品牌榜单工地临时/户外移动厕所出租/移动公厕租赁/出租移动厕所公司推荐
  • 机器学习鼻祖级算法——使用SVM实现多分类及Python实现 - 指南
  • 城市生命线安全专项应用系统--供水管网安全监测环境
  • linux asp.net
  • 2025年苗木批发基地十大诚信批发商排行,青叶复叶槭/红叶李/金叶复叶槭/紫薇/苗木/栾树/白蜡/油松/无刺枸骨球/红叶石楠种植怎么选择
  • 2025年铁氟龙喷涂加工厂家最新推荐:东莞华耐金属,覆盖广东/东莞/广州/清远/肇庆/汕尾/揭阳/汕头
  • 每日 Emacs Tip:Keyboard Macros(键盘宏)——内置小功能详解
  • 使用Kepserver发布数据到MQTT
  • Flask/Jinja2 SSTI研究 —— 为什么总是lipsum?
  • linux as 命令
  • 从 OKR 到 BARS:绩效管理系统助你精准匹配考核工具
  • RAG入门
  • 2025年陶瓷污泥压滤机厂家权威推荐榜单:铜尾渣陶瓷压滤机/陶瓷厂真空过滤机/精密陶瓷脱水机源头厂家精选