[费用流] LOJ#545. 「LibreOJ β Round #7」小埋与游乐场
有两种操作是有效的
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」小埋与游乐场相关推荐
- 【费用流】loj#545. 「LibreOJ β Round #7」小埋与游乐场
好像现在看来这个缩点的思路挺清晰啊 题目描述 有两个非负整数组成的可重集合 $A$ 和 $B$. 现在你可以对 $A$ 中至多 $k$ 个元素进行操作.操作方法为:设你准备操作且未被操作过的 $A$ ...
- LibreOJ545. 「LibreOJ β Round #7」小埋与游乐场【网络流】
545. 「LibreOJ β Round #7」小埋与游乐场 [题目描述] 传送门 [题解] 网络流,我们发现lowbit之后相同的点连出的边是相同的,所以可以缩点. [代码如下] #include ...
- [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...
- [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)
#521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
- 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 ...
- LOJ #516. 「LibreOJ β Round #2」DP 一般看规律
题目描述 给定一个长度为 n 的序列 a,一共有 m 个操作. 每次操作的内容为:给定 x,y,序列中所有 x 会变成 y. 同时我们有一份代码: int ans = 2147483647; for ...
- [线段树分治][DP] LOJ #534. 「LibreOJ Round #6」花团
Solution S o l u t i o n Solution 操作相当于是动态的做一个背包DP. 离线的话,线段树分治一下. 因为结尾是已知的,可以一边分治,得到一个修改操作,就插到线段树. 只 ...
- loj 523 「LibreOJ β Round #3」绯色 IOI(悬念) 霍尔定理+基环树+线段树
题目分析 神仙题(确信) 首先,j−aij-a _ ij−ai和ai−ja _ i-jai−j互为相反数,若其中最小值为bib _ ibi,则一个为bib _ ibi一个为m−bim-b _ ...
最新文章
- Python 为什么用 # 号作注释符?
- linux kvm安装windows,Linux下KVM安装windows
- mysql8.0.23下载安装详细教程
- ansible 并发设置_如何使用Ansible通过Prometheus设置系统监视
- Oracle 去掉重复字符串
- matlab如何求解定积分,matlab如何求解定积分
- python实现大学物理实验不确定度计算
- mysql中根据经纬度求距离_mysql、java中根据经纬度计算距离
- c语言病毒编写教程,来来来,教你一个用C语言写个小病毒
- 9种常见的HR数据分析方法
- 云原生开发平台的选择
- 常见的各种字幕内容总结(字幕基础、字幕介绍、字幕种类及常见格式、SRT+ASS+LYC等等)
- 大数据早报:阿里巴巴收购以色列创业公司 迅雷再次回应玩客云用户维权事件(12.1)
- CSS让行内元素撑满整个视口
- C语言中八进制和16进制怎么表示,原码,反码及补码,C语言按位取反运算符~
- win7纯净系统安装
- 火狐浏览器(firefox)如何定制特定的“新建标签页”
- [教师资格证-中学笔试-裸考过关]教育知识与能力必背知识点(技巧)
- 用WinGrub来引导Linux的安装
- Java集合框架完全解析