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 ...
随机推荐
- FCL源码中数组类型的学习及排序函数Sort函数的分析
Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点 能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...
- Spring Boot + Jersey发生FileNotFoundException (No such file or directory)
我在使用Spring Boot + Jersey 项目,解决了上一篇随笔中的FileNotFoundException,然后又报了一个FileNotFoundException,不过报错信息不一样了 ...
- Unknown entity: org.jbpm.services.task.audit.TaskEventImpl
1. use this persistence.xml - simply copy it into src/main/resources/META-INF please note the name o ...
- Android hybrid App项目构建和部分基本开发问题
1.首先是选型:Cordova+Ionic Framework,调试测试环境是Ripple Emulator.开发环境其实可以随便选,我个人选择了Eclipse,当然Android SDK+ADT也是 ...
- visual studio中如何将string类型值转为BYTE(unsigned char)类型
昨天困惑一件事,就是手里有个string类型的字符串,像01 23 45 67 89 AB CD EF,根据空格拆分为一个个的子字符串后(如EF),需要放到一个BYTE(typedef unsigne ...
- C#学习笔记 day_three
C#学习笔记 day three Chapter 3 类型 3.3引用类型 引用类型的变量也成为对象,有六种类型:(1)对象类型 (2)字符串类型 (3)类类型 (4)数组类型 (5)接口类型 (6) ...
- JavaScript之对象继承
原型链继承 function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ ...
- mysql 给表添加唯一约束、联合唯一约束,指定唯一约束的名字
表结构 FIELD TYPE COLLATION NULL KEY DEFAULT Extra PRIVILEGES ...
- oracle数据库语句积累
1.从一个表选出数据更新另一个表(后面的exists一定要加) update jqhdzt set shid = (select shid from v_plat_userjqinfo t where ...
- String 类的函数实现
#include<iostream> //#include<string> using namespace std; class Strings { public: Strin ...