传送门

网络流好题。


这道题可以动态建图。

不难想到把每个球iii都拆点成i1i_1i1​和i2i_2i2​,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1​),(i2​,t),如果(u,v)(u,v)(u,v)可以匹配的话就连边(u1,v2)(u_1,v_2)(u1​,v2​),然后用最大流检验,如果能流动说明不用加柱子,否则需要新加一个柱子。

题目还要求输出方案。

那么我们在dfsdfsdfs的时候更新后继就可以了。

代码:

#include<bits/stdc++.h>
#define N 50005
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
struct edge{int v,c,next;};
int n,ans,tot,bg[60],nxt[N];
bool vis[N];
struct Dinic{
	int first[N],cur[N],cnt,d[N],s,t;
	edge e[N<<1];
	inline void init(){s=0,t=N-1,memset(first,-1,sizeof(first)),cnt=-1;}
	inline void addedge(int u,int v,int c){e[++cnt].v=v,e[cnt].c=c,e[cnt].next=first[u],first[u]=cnt;}
	inline void add(int u,int v,int c){addedge(u,v,c),addedge(v,u,0);}
	inline bool bfs(){
		queue<int>q;
		memset(d,-1,sizeof(d)),d[s]=0,q.push(s);
		while(!q.empty()){
			int x=q.front();
			q.pop();
			for(int i=first[x];~i;i=e[i].next){
				int v=e[i].v;
				if(~d[v]||!e[i].c)continue;
				d[v]=d[x]+1,q.push(v);
			}
		}
		return ~d[t];
	}
	inline int dfs(int p,int f){
		if(p==t)return f;
		int flow=f;
		for(int&i=cur[p];~i;i=e[i].next){
			int v=e[i].v;
			if(!flow)break;
			if(e[i].c&&d[v]==d[p]+1){
				int tmp=dfs(v,min(flow,e[i].c));
				if(v!=t)nxt[p>>1]=v>>1;
				if(!tmp)d[v]=-1;
				e[i].c-=tmp,e[i^1].c+=tmp,flow-=tmp;
			}
		}
		return f-flow;
	}
	inline int solve(){
		int ret=0;
		while(bfs())memcpy(cur,first,sizeof(first)),ret+=dfs(s,0x3f3f3f3f);
		return ret;
	}
}dinic;
int main(){
	n=read(),ans=0,tot=0,dinic.init();
	while(tot<=n){
		++ans,dinic.add(dinic.s,ans*2,1),dinic.add(ans*2+1,dinic.t,1);
		for(int i=sqrt(ans)+1;i*i<ans*2;++i)dinic.add((i*i-ans)*2,ans*2+1,1);
		if(!dinic.solve())bg[++tot]=ans;
	}
	--ans,printf("%d\n",ans);
	for(int i=1;i<=n;++i){
		if(vis[bg[i]])continue;
		int pos=bg[i];
		vis[pos]=1;
		while(pos)printf("%d ",pos),pos=nxt[pos],vis[pos]=1;
		puts("");
	}
	return 0;
}

2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)的更多相关文章

  1. 2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)

    传送门 费用流水题. 依然是照着题意模拟建边就行了. 为了练板子又重新写了一遍费用流. 代码: #include<bits/stdc++.h> #define N 305 #define ...

  2. 2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)

    传送门 费用流入门题. 直接按照题意模拟. 把货物的数量当做容量建边. 然后跑一次最小费用流和最大费用流就行了. 代码: #include<bits/stdc++.h> #define N ...

  3. [loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

    #6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

  4. 【刷题】LOJ 6003 「网络流 24 题」魔术球

    题目描述 假设有 \(n\) 根柱子,现要按下述规则在这 \(n\) 根柱子中依次放入编号为 \(1, 2, 3, 4, \cdots\) 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任 ...

  5. LibreOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

    6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

  6. Libre 6003 「网络流 24 题」魔术球 (网络流,最大流)

    Libre 6003 「网络流 24 题」魔术球 (网络流,最大流) Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只 ...

  7. 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)

    传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...

  8. 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)

    传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...

  9. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

随机推荐

  1. jpa-入门级测试

  2. ajax 遍历json一维数组

    $.each(data,function(index,value){}data必须是Object类型index是数组的下标value可以是一个对象 function myonclick() { var ...

  3. php用正则判断是否为数字

    验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验证有两位小数 ...

  4. mysql 1292-Truncated incorrect double value

    sql = "select id from company where date_year_month = %s" % "2017-3" 出错 将%s改为'%s ...

  5. 两个关于URL解析的例子

    例一: /* 解析URL查寻串中的name=value参数对 将name=value对存储在对象属性中,并返回对象 alert(getQuery().name) */ function getQuer ...

  6. NTP时间服务器搭建

    系统时区设置::: 查看当前时区# date -R修改系统时区# timeconfig  或# cp  /usr/share/zoneinfo/Asia/Shanghai  /etc/localtim ...

  7. [转] #ifndef#define#endif的用法(整理) 原作者:icwk

    文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了, ...

  8. 再识ASCII实体、符号实体和字符实体

    一.前言            相信大家都熟悉通过字符实体   来实现多个连续空格的输入吧!本文打算对三类HTML实体及JS相关操作作进一步的整理和小结,若有纰漏请大家指正,谢谢. 二.初识HTML实 ...

  9. 基元线程同步构造之 Mutes(互斥体)

    互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)). 互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section). 因 ...

  10. MongoDB 数据查询

    数据查询 基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty(): ...