直接网络流模拟即可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. Collections.sort自定义排序的使用方法

    Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...

  2. DIV与SPAN之间有什么区别

    DIV与SPAN之间有什么区别 DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元 ...

  3. redis分布式锁实践

    分布式锁在多实例部署,分布式系统中经常会使用到,这是因为基于jvm的锁无法满足多实例中锁的需求,本篇将讲下redis如何通过Lua脚本实现分布式锁,不同于网上的redission,完全是手动实现的 我 ...

  4. Day9 操作系统介绍

    操作系统简介(转自林海峰老师博客介绍)

  5. 8.1 Socket编程

    8.1 Socket编程 在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览 ...

  6. javaWeb安全漏洞修复总结

    1 Web安全介绍1 2 SQL注入.盲注1 2.1 SQL注入.盲注概述 1 2.2 安全风险及原因 2 2.3 AppScan扫描建议 2 2.4 应用程序解决方案 4 3 会话标识未更新7 3. ...

  7. SQLServer2PostgreSQL迁移过程中的几个问题

    1.PostgreSQL 跨平台迁移工具Migration Toolkit的使用指南:http://www.enterprisedb.com/docs/en/8.4/mtkguide/Table%20 ...

  8. java8完全解读一

    java8完全解读 java8完全解读前言java8的一些新特性1.为什么要用java8?1.1首先想到的逻辑应该是如下1.2使用策略模式来解这个问题1.3使用策略模式和内部类来解决问题1.4使用策略 ...

  9. 分布式服务通讯框架XXL-RPC

    <分布式服务通讯框架XXL-RPC>    一.简介 1.1 概述 XXL-RPC 是一个分布式服务通讯框架,提供稳定高性能的RPC远程服务调用功能.现已开放源代码,开箱即用. 1.2 特 ...

  10. LeeCode数组第15题三数之和

    题目:三数之和 内容: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中 ...