bzoj5251 [2018多省省队联测]劈配
直接网络流模拟即可AC。
可持久化+暴力=90分,
可持久化+二分=30分,
暴力加边+二分=100分。
我也很无奈啊。
Ivan便涨红了脸,额上的青筋条条绽出,争辩道,“memcpy也是可持久化……memcpy!……OIer的事,当然是可持久化!”接连便是难懂的话,什么“可持久化无旋Treap套线段树启发式合并”,什么“暴力踩正解”之类,引得众人都哄笑起来。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#define N 205
#define inf 0x7fffffff
using namespace std;
struct FLOW{
int e,head[];
struct edge{
int u,v,f,of,next;
}ed[N*N<<];
void add(int u,int v,int f){
ed[e].u=u;ed[e].v=v;ed[e].f=f;ed[e].next=head[u];head[u]=e++;
ed[e].u=v;ed[e].v=u;ed[e].f=;ed[e].next=head[v];head[v]=e++;
}
int dep[],S,T;
bool bfs(){
memset(dep,,sizeof dep);
queue<int> q;
q.push(S);dep[S]=;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=ed[i].next){
if(ed[i].f&&!dep[ed[i].v]){
dep[ed[i].v]=dep[x]+;
if(ed[i].v==T)return ;
q.push(ed[i].v);
}
}
}
return ;
}
int dfs(int x,int f){
if(x==T||!f)return f;
int ans=;
for(int i=head[x];i;i=ed[i].next){
int v=ed[i].v;
if(ed[i].f&&dep[v]==dep[x]+){
int nxt=dfs(v,min(f,ed[i].f));
ans+=nxt;f-=nxt;ed[i].f-=nxt;ed[i^].f+=nxt;
if(!f)break;
}
}
if(!ans)dep[x]=-;
return ans;
}
int dinic(){
int ans=;
while(bfs())ans+=dfs(S,inf);
return ans;
}
void init(){
memset(head,,sizeof head);
e=;
}
}F,G,NF;
int T,C,n,m,b[N],dr[N],pos[N][N],g[N][N],bo[N],ans[N],pp[N],sum[N];
vector <int> V[N];
int O;
bool cmp(int a,int b){
return g[O][a]<g[O][b];
}
bool check(int x,int i){
NF.init();
NF.S=n+m+;NF.T=n+m+;
for(int j=;j<=m;j++)NF.add(n+j,NF.T,b[j]);
for(int j=;j<=x;j++){
NF.add(NF.S,j,);
for(int k=;k<V[j].size();k++)
NF.add(j,n+V[j][k],);
}
NF.add(NF.S,i,);
for(int k=;k<=m&&g[i][pos[i][k]]<=dr[i];k++)NF.add(i,n+pos[i][k],);
if(NF.dinic()==sum[x]+)return ;
return ;
}
int main(){
scanf("%d%d",&T,&C);
while(T--){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d",&b[i]);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
pos[i][j]=j;
scanf("%d",&g[i][j]);
if(!g[i][j])g[i][j]=;
}
O=i;
sort(pos[i]+,pos[i]+m+,cmp);
}
for(int i=;i<=n;i++)scanf("%d",&dr[i]);
F.init();
F.S=n+m+;F.T=F.S+;
for(int i=;i<=n;i++)F.add(F.S,i,);
for(int i=;i<=m;i++)F.add(n+i,F.T,b[i]);
G=F;
for(int i=;i<=n;i++)V[i].clear();
memset(pp,,sizeof pp);
memset(ans,,sizeof ans);
memset(bo,,sizeof bo);
for(int i=;i<=n;i++){
for(int j=,k=;j<=m;j=++k){
if(g[i][pos[i][j]]==)break;
while(k<m&&g[i][pos[i][k+]]==g[i][pos[i][j]])k++;
for(int l=j;l<=k;l++)F.add(i,n+pos[i][l],);
if(F.bfs()&&F.dfs(F.S,inf)==){
pp[i]=g[i][pos[i][j]];
for(int l=j;l<=k;l++)V[i].push_back(pos[i][l]);
break;
}
}
if(!pp[i])pp[i]=m+,sum[i]=sum[i-];
else{
for(int j=;j<V[i].size();j++)
G.add(i,n+V[i][j],);
G.bfs();G.dfs(G.S,inf);
sum[i]=sum[i-]+;
}
F=G;
}
for(int i=;i<=n;i++){
if(g[i][pos[i][]]>dr[i]){ans[i]=i;continue;}
int l=,r=i-,mid,fin=;
while(l<=r){
mid=(l+r)>>;
if(check(mid,i))fin=mid,l=mid+;
else r=mid-;
}
ans[i]=i-r-;
}
for(int i=;i<=n;i++)printf("%d%c",pp[i],((i==n)?'\n':' '));
for(int i=;i<=n;i++)printf("%d%c",ans[i],((i==n)?'\n':' '));
}
return ;
}
bzoj5251 [2018多省省队联测]劈配的更多相关文章
- bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)
https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...
- bzoj 5251: [2018多省省队联测]劈配
Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayi ...
- BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树
BZOJ_5249_[2018多省省队联测]IIIDX_线段树 Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐 ...
- 5249: [2018多省省队联测]IIIDX
5249: [2018多省省队联测]IIIDX 链接 分析: 贪心. 将给定的权值从大到小排序,从第一个往后挨个赋值,考虑第i个位置可以赋值那些树.首先满足前面必须至少有siz[i]个权值没选,如果存 ...
- bzoj 5249 [2018多省省队联测] IIIDX
bzoj 5249 [2018多省省队联测] IIIDX Link Solution 首先想到贪心,直接按照从大到小的顺序在后序遍历上一个个填 但是这样会有大问题,就是有相同的数的时候,会使答案不优 ...
- bzoj 5248: [2018多省省队联测]一双木棋
Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...
- bzoj5252 [2018多省省队联测]林克卡特树
斜率优化树形dp?? 我们先将问题转化成在树上选K+1条互不相交路径,使其权值和最大. 然后我们考虑60分的dp,直接维护每个点子树内选了几条路径,然后该点和0/1/2条路径相连 然后我们会发现最后的 ...
- bzoj5250 [2018多省省队联测]秘密袭击
博主蒟蒻,目前还不会动态dp,所以下面说的是一个并不优秀的暴力,我会补的! 我们考虑按权值从大到小依次点亮每个点,相同权值可以同时点亮,每次点亮后,我们进行一次树形背包. 处理出$f[i][j]$表示 ...
- bzoj5253 [2018多省省队联测]制胡窜
后缀自动机挺好毒瘤的题. 我们考虑哪些切点是不合法的.肯定是所有的匹配串都被切了. 我们考虑第一个切口的位置. 当第一个切口在第一个出现位置前时,第二个切口必须切掉所有的串. 当第一个切口在$l_{i ...
随机推荐
- solr研磨之facet
作者:战斗民族就是干 转载请注明地址:http://www.cnblogs.com/prayers/p/8822417.html Facet 开门见山,facet解决的就是筛选,我是把它理解为一种聚合 ...
- AngularJs 指令directive之require
controller的用法分为两种情形,一种是require自定义的controller,由于自定义controller中的属性方法都由自己编 写,使用起来比较简单:另一种方法则是require An ...
- Error filterStart的问题
今天出现这个问题 严重: Error filterStart org.apache.catalina.core.StandardContext start 严重: Context startup fa ...
- 自设table表格,获取内容,并经弹出框的url传参,获取结果显示在弹出框,并加载合计
table表格,选择框 form id="editForm1"> <table class="table_form"> <td > ...
- WEB 集群与负载均衡(一)基本概念-上
Web集群是由多个同时运行同一个web应用的服务器组成,在外界看来就像一个服务器一样,这多台服务器共同来为客户提供更高性能的服务.集群更标准的定义是:一组相互独立的服务器在网络中表现为单一的系统,并以 ...
- Android集成ffmpeg
1.ffmpeg官网文档地址:https://trac.ffmpeg.org/wiki/CompilationGuide/Android 2.上面页面资源列表里面第一项 https://github. ...
- python新手---学习第一天
Python是一门跨平台.开源.免费的解释型高级动态编程语言,它支持伪编译将源代码转换成字节码来优化程序提高运行速度和对源码进行保密,并且支持使用py2exe.pyinstaller.cx_Freez ...
- Jquery浅克隆与深克隆
Jquery浅克隆与深克隆 JavaScript部分 $("div").on('click', function() {//执行操作}) //clone处理一 $("di ...
- 使用ssh keys实现免验证登陆远程服务
使用ssh keys实现免验证登陆远程服务========================Created 星期四 10 五月 2018 引言------------------程序员或者服务器运维人员 ...
- 总结Array类型中常用的方法
Array类型应该是 ECMAScript 中最常用的类型之一了,并且它定义的数组与其他语言有着相当大的区别.数组是数据的有序集合,我们可以通过下标对指定位置的数据进行读 写:特别的是,在 ECMAS ...