直接网络流模拟即可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多省省队联测]劈配的更多相关文章

  1. bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...

  2. bzoj 5251: [2018多省省队联测]劈配

    Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayi ...

  3. BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树

    BZOJ_5249_[2018多省省队联测]IIIDX_线段树 Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐 ...

  4. 5249: [2018多省省队联测]IIIDX

    5249: [2018多省省队联测]IIIDX 链接 分析: 贪心. 将给定的权值从大到小排序,从第一个往后挨个赋值,考虑第i个位置可以赋值那些树.首先满足前面必须至少有siz[i]个权值没选,如果存 ...

  5. bzoj 5249 [2018多省省队联测] IIIDX

    bzoj 5249 [2018多省省队联测] IIIDX Link Solution 首先想到贪心,直接按照从大到小的顺序在后序遍历上一个个填 但是这样会有大问题,就是有相同的数的时候,会使答案不优 ...

  6. bzoj 5248: [2018多省省队联测]一双木棋

    Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...

  7. bzoj5252 [2018多省省队联测]林克卡特树

    斜率优化树形dp?? 我们先将问题转化成在树上选K+1条互不相交路径,使其权值和最大. 然后我们考虑60分的dp,直接维护每个点子树内选了几条路径,然后该点和0/1/2条路径相连 然后我们会发现最后的 ...

  8. bzoj5250 [2018多省省队联测]秘密袭击

    博主蒟蒻,目前还不会动态dp,所以下面说的是一个并不优秀的暴力,我会补的! 我们考虑按权值从大到小依次点亮每个点,相同权值可以同时点亮,每次点亮后,我们进行一次树形背包. 处理出$f[i][j]$表示 ...

  9. bzoj5253 [2018多省省队联测]制胡窜

    后缀自动机挺好毒瘤的题. 我们考虑哪些切点是不合法的.肯定是所有的匹配串都被切了. 我们考虑第一个切口的位置. 当第一个切口在第一个出现位置前时,第二个切口必须切掉所有的串. 当第一个切口在$l_{i ...

随机推荐

  1. 关于iOS9 HTTP不能正常使用的解决方法

    在工程的info.plist文件中添加NSAPPTransportSecurity类型为Dictionary,在NSAPPTransportSecurity下添加NSAllowsArbitraryLo ...

  2. Map 遍历分析

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...

  3. 什么是shell? bash和shell有什么关系?

    什么是shell? bash和shell有什么关系? 博客分类: Linux   什么是Shell?      shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序 ...

  4. 使用可变对象作为python函数默认参数引发的问题

    写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...

  5. Angular HttpClient upload file with FormData

    从sof上找到一个example:https://stackoverflow.com/questions/46206643/asp-net-core-2-0-and-angular-4-3-file- ...

  6. element.dispatchEvent is not a function的解决

    Firebug中的出错提示: element.dispatchEvent is not a function element.dispatchEvent(event); prototype.js (第 ...

  7. Qt中的ui指针和this指针

    初学qt,对其ui指针和this指针产生疑问,画了个把小时终于搞懂了. 首先看ui指针的定义: 在mainwindow.h中 private: Ui::MainWindow *ui; Ui又是什么? ...

  8. birt4.6部署到tomcat及启动服务报错解决方法

    一.下载birt-runtime-4.6.0-20160607.zip包 解压后birt-runtime-4.6.0-20160607\WebViewerExample将WebViewerExampl ...

  9. linux系统开机流程详解

    今天,我们主要来谈谈计算机系统的启动流程 1.BIOS启动 BIOS是写入到主板上的一个韧体(韧体就是写入到硬件上的一个软件程序).开机的时候,BIOS是计算机系统会主动执行的第一个程序.BIOS主要 ...

  10. 《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

    一.关于T-SQL T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL. 二.逻辑查询处理各个阶段 2.1 逻辑查询处理流 ...