有两种操作是有效的

lowbit(ai)>lowbit(bj)lowbit(ai)>lowbit(bj)lowbit(a_i)>lowbit(b_j) 或者 ai=bjai=bja_i=b_j

当 lowbit(ai)>lowbit(bj)lowbit(ai)>lowbit(bj)lowbit(a_i)>lowbit(b_j) 的 aiaia_i 和 bjbjb_j 操作时,对答案影响是 lowbit(ai)−lowbit(bj)lowbit(ai)−lowbit(bj)lowbit(a_i)-lowbit(b_j)

当 ai=bjai=bja_i=b_j 的 aiaia_i 和 bjbjb_j 操作时,对答案影响是 lowbit(ai)lowbit(ai)lowbit(a_i)

令 cntaicntaicnta_i 表示 AAA 中 lowbit(a)=2i" role="presentation">lowbit(a)=2ilowbit(a)=2ilowbit(a)=2^i 的个数,cntbicntbicntb_i 表示 BBB ,cntc" role="presentation">cntccntccnt_c 表示 a=ba=ba=b 且 lowbit(a)=2ilowbit(a)=2ilowbit(a)=2^i 的对数

对每个 cntaicntaicnta_i 和 cntbicntbicntb_i 建一个点

源点向 cntaicntaicnta_i 的点连流量为 cntaicntaicnta_i 费用为 0 的边

cntbicntbicntb_i 的点向 XXX 连流量为 cntbi" role="presentation">cntbicntbicntb_i 费用为0的边

XXX 向汇点连流量为 k" role="presentation">kkk,费用为0的边

cntaicntaicnta_i 向 cntbj(j<i)cntbj(j<i)cntb_j(j 连流量无穷费用为 2i−2j2i−2j2^i-2^j 的边

cntaicntaicnta_i 向 cntbicntbicntb_i 连流量为 cntcicntcicntc_i 费用为 2i2i2^i 的边

∑lowbit(ai)−∑lowbit(ai)−\sum lowbit(a_i)-最大费用流就是答案

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>using namespace std;typedef long long ll;const int N=1200010,inf=1<<29;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}inline void read(int &x){char c=nc(); x=0;for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}int n,m,k,a[N],b[N],cnta[40],cntb[40],cntc[40],g[N];inline int lowest(int x){int ret=0;if(x&32767); else ret+=15,x>>=15;if(x&255); else ret+=8,x>>=8;if(x&15); else ret+=4,x>>=4;if(x&3); else ret+=2,x>>=2;if(x&1); else ret++;return ret;
}ll ans,dis[N];int t,S,T,cnt=1,G[N];
struct edge{int t,nx,f,c;
}E[N];inline void addedge(int x,int y,int f,int c){E[++cnt].t=y; E[cnt].nx=G[x]; E[cnt].f=f; E[cnt].c=c; G[x]=cnt;E[++cnt].t=x; E[cnt].nx=G[y]; E[cnt].f=0; E[cnt].c=-c; G[y]=cnt;
}queue<int> Q;
int vis[N],frm[N];inline bool spfa(){for(int i=S;i<=T;i++) dis[i]=-inf;vis[S]=1; Q.push(S); dis[S]=0;while(!Q.empty()){int x=Q.front(); Q.pop(); vis[x]=0;for(int i=G[x];i;i=E[i].nx)if(E[i].f && dis[E[i].t]<dis[x]+E[i].c){dis[E[i].t]=dis[x]+E[i].c;frm[E[i].t]=i;if(!vis[E[i].t])vis[E[i].t]=1,Q.push(E[i].t);}}if(dis[T]<=0) return false;int mf=inf;for(int i=T;i;i=E[frm[i]^1].t) mf=min(mf,E[frm[i]].f);ans-=mf*dis[T];for(int i=T;i;i=E[frm[i]^1].t) E[frm[i]].f-=mf;return true;
}int main(){freopen("1.in","r",stdin);freopen("1.out","w",stdout);read(n);for(int i=1;i<=n;i++){read(a[i]);if(!a[i]) continue;cnta[lowest(a[i])]++,ans+=a[i]&-a[i];}read(m);for(int i=1;i<=m;i++){read(b[i]);if(!b[i]) continue;cntb[lowest(b[i])]++;}sort(a+1,a+1+n); sort(b+1,b+1+m);for(int i=1,j,p=1;i<=n;i=j+1){for(j=i;a[j+1]==a[i] && j<n;j++);int cnt=0;while(p<=m && b[p]<a[i]) p++;while(p<=m && b[p]==a[i]) p++,cnt++;cnt=min(cnt,j-i+1);if(!a[i]) continue;cntc[lowest(a[i])]+=cnt;}S=0; t=61; T=62;for(int i=0;i<30;i++){for(int j=0;j<i;j++)addedge(i+1,j+31,inf,(1<<i)-(1<<j));addedge(i+1,i+31,cntc[i],(1<<i));addedge(S,i+1,cnta[i],0);addedge(i+31,t,cntb[i],0);}read(k);addedge(t,T,k,0);while(spfa());printf("%lld\n",ans);return 0;
}

[费用流] LOJ#545. 「LibreOJ β Round #7」小埋与游乐场相关推荐

  1. 【费用流】loj#545. 「LibreOJ β Round #7」小埋与游乐场

    好像现在看来这个缩点的思路挺清晰啊 题目描述 有两个非负整数组成的可重集合 $A$ 和 $B$. 现在你可以对 $A$ 中至多 $k$ 个元素进行操作.操作方法为:设你准备操作且未被操作过的 $A$ ...

  2. LibreOJ545. 「LibreOJ β Round #7」小埋与游乐场【网络流】

    545. 「LibreOJ β Round #7」小埋与游乐场 [题目描述] 传送门 [题解] 网络流,我们发现lowbit之后相同的点连出的边是相同的,所以可以缩点. [代码如下] #include ...

  3. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...

  4. [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)

    #521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...

  5. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

  6. LOJ 572 「LibreOJ Round #11」Misaka Network 与求和——min_25筛

    题目:https://loj.ac/problem/572 莫比乌斯反演得 \( ans=\sum\limits_{D=1}^{n}\left\lfloor\frac{n}{D}\right\rflo ...

  7. LOJ #516. 「LibreOJ β Round #2」DP 一般看规律

    题目描述 给定一个长度为 n 的序列 a,一共有 m 个操作. 每次操作的内容为:给定 x,y,序列中所有 x 会变成 y. 同时我们有一份代码: int ans = 2147483647; for ...

  8. [线段树分治][DP] LOJ #534. 「LibreOJ Round #6」花团

    Solution S o l u t i o n Solution 操作相当于是动态的做一个背包DP. 离线的话,线段树分治一下. 因为结尾是已知的,可以一边分治,得到一个修改操作,就插到线段树. 只 ...

  9. loj 523 「LibreOJ β Round #3」绯色 IOI(悬念) 霍尔定理+基环树+线段树

    题目分析 神仙题(确信) 首先,j−aij-a _ ij−ai​和ai−ja _ i-jai​−j互为相反数,若其中最小值为bib _ ibi​,则一个为bib _ ibi​一个为m−bim-b _ ...

最新文章

  1. Python 为什么用 # 号作注释符?
  2. linux kvm安装windows,Linux下KVM安装windows
  3. mysql8.0.23下载安装详细教程
  4. ansible 并发设置_如何使用Ansible通过Prometheus设置系统监视
  5. Oracle 去掉重复字符串
  6. matlab如何求解定积分,matlab如何求解定积分
  7. python实现大学物理实验不确定度计算
  8. mysql中根据经纬度求距离_mysql、java中根据经纬度计算距离
  9. c语言病毒编写教程,来来来,教你一个用C语言写个小病毒
  10. 9种常见的HR数据分析方法
  11. 云原生开发平台的选择
  12. 常见的各种字幕内容总结(字幕基础、字幕介绍、字幕种类及常见格式、SRT+ASS+LYC等等)
  13. 大数据早报:阿里巴巴收购以色列创业公司 迅雷再次回应玩客云用户维权事件(12.1)
  14. CSS让行内元素撑满整个视口
  15. C语言中八进制和16进制怎么表示,原码,反码及补码,C语言按位取反运算符~
  16. win7纯净系统安装
  17. 火狐浏览器(firefox)如何定制特定的“新建标签页”
  18. [教师资格证-中学笔试-裸考过关]教育知识与能力必背知识点(技巧)
  19. 用WinGrub来引导Linux的安装
  20. Java集合框架完全解析

热门文章

  1. MFC com控件类
  2. web前端工程师简历
  3. android环境监测,基于Wi―Fi和Android家居环境监测与实现
  4. 域名该怎样选_网站域名应该怎样选择?
  5. 直播界要哭了!罗永浩进军电商直播:最可怕的对手,永远来自未知领域!
  6. JAVA 求出自然数101~199中的所有素数,每行显示10个数
  7. Android指示器的使用总结
  8. 第一讲:高性能计算基础知识讲解
  9. 海信信号机后台服务器配置,海信6101信号机功能.docx
  10. php 实现查询百度排名,查询百度关键词排名代码 php