[luogup2526][shoi2001]小狗散步(二分图最大匹配)

蒟蒻zht的博客 蒟蒻zht的博客     2022-10-09     307

关键词:

传送门

 

简直就是模板题啊!

 

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 101

using namespace std;

int n, m, cnt;
int X1[N], Y1[N], X2[N], Y2[N], head[N], to[N * N], nex[N * N], belong[N], ans[N];
bool vis[N];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
	return x * f;
}

inline void add(int x, int y)
{
	to[cnt] = y;
	nex[cnt] = head[x];
	head[x] = cnt++;
}

inline double dis(double a, double b, double c, double d)
{
	return sqrt((a - c) * (a - c) + (b - d) * (b - d));
}

inline bool dfs(int u)
{
	int i, v;
	for(i = head[u]; ~i; i = nex[i])
	{
		v = to[i];
		if(!vis[v])
		{
			vis[v] = 1;
			if(!belong[v] || dfs(belong[v]))
			{
				belong[v] = u;
				return 1;
			}
		}
	}
	return 0;
}

inline int solve()
{
	int i, ret = 0;
	for(i = 1; i < n; i++)
	{
		memset(vis, 0, sizeof(vis));
		ret += dfs(i);
	}
	return ret;
}

int main()
{
	int i, j;
	double x, y, z;
	n = read();
	m = read();
	memset(head, -1, sizeof(head));
	for(i = 1; i <= n; i++)
		X1[i] = read(), Y1[i] = read();
	for(i = 1; i <= m; i++)
		X2[i] = read(), Y2[i] = read();
	for(i = 1; i < n; i++)
	{
		x = dis(X1[i], Y1[i], X1[i + 1], Y1[i + 1]);
		for(j = 1; j <= m; j++)
		{
			y = dis(X1[i], Y1[i], X2[j], Y2[j]);
			z = dis(X1[i + 1], Y1[i + 1], X2[j], Y2[j]);
			if(x * 2 + 1e-9 >= y + z) add(i, j);
		}
	}
	printf("%d
", solve() + n);
	for(i = 1; i <= m; i++) ans[belong[i]] = i;
	for(i = 1; i <= n; i++)
	{
		printf("%d %d ", X1[i], Y1[i]);
		if(ans[i]) printf("%d %d ", X2[ans[i]], Y2[ans[i]]);
	}
	return 0;
}

  

[p2526][shoi2001]小狗散步(代码片段)

Link:P2526传送门Solution:一道提示非常到位的题目题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献于是明显可以将原题看作询问在两个不相交点集间最多能连几条边接下来将合法边连上跑二分图匹... 查看详情

luogup4279[shoi2008]小约翰的游戏(代码片段)

LuoguP4279[SHOI2008]小约翰的游戏题目描述链接SolutionAnti-SG的模板题这里就直接放代码#include<bits/stdc++.h>usingnamespacestd;inlinelonglongread()longlongf=1,x=0;charch;doch=getchar();if(ch==‘-‘)f=-1;while(ch<‘0‘|| 查看详情

luogup1291[shoi2002]百事世界杯之旅

题目链接luoguP1291[SHOI2002]百事世界杯之旅题解设\(f[k]\)表示还有\(k\)个球员没有收集到的概率再买一瓶,买到的概率是\(k/n\),买不到的概率是\((n-k)/k\)那么\(f[k]=f[k]*(n-k)/n+f[k-1]*k/n+1\)移向一下\(f[k]=f[k-1]+n/k\)代码#include<cstdio>#inclu... 查看详情

luogup3998[shoi2013]发微博

题目描述刚开通的SH微博共有n个用户(1Ln标号),在这短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录:!x表示用户x发了一条微博;+xy表示用户x和用户y成为了好友?xy表示用户x和用户y解除了好友关系当一个用... 查看详情

[luogup2161[[shoi2009]会场预约(splay)(代码片段)

 题面传送门:https://www.luogu.org/problemnew/show/P2161    Solutionsplay的确有线段树/树状数组的做法,但我做的时候脑残没想到我们可以考虑写一个类似NOIP2017D2T3列队那道题那样的带分裂的平衡树考虑用splay维护每一条线... 查看详情

luogup3990[shoi2013]超级跳马(代码片段)

这道题还是一道比较不可做的矩阵题首先我们先YY一个递推的算法:令f[i][j]表示走到第i行第j列时的方案数,那么有以下转移:f[i][j]=f[i-1][j-2*k+1]+f[i+1][j-2*k+1]+f[i][j-2*k+1](1<=k<=i/2)但这样是很慢的,然后我们就可以前缀和优化这... 查看详情

排序工作量之新任务(shoi2001)

排序工作量之新任务(SHOI2001)给出两个整数n和t,求n的全排列中逆序对数为t的个数,和逆序对数为t的字典序最小全排列。首先第一个问题可以用dp解决,\(f[i][j]\)表示前i个数,j个逆序对的序列数,那么\(f[i][j]=f[i-1][j-k]\(k<i)(k... 查看详情

luogup3830[shoi2012]随机树期望概率+动态规划+结论(代码片段)

题意非常的复杂,考虑转化一下:每次选择一个叶节点,删除本叶节点(深度为$dep$)的同时,加入两个深度为$dep+1$的叶节点,重复$n$轮首先考虑第$1$问,(你看我这种人相信数据绝对是最大的数据,直接$f[i][S]$表示$i$个叶子结... 查看详情

搜索洛谷p2530[shoi2001]化工厂装箱员

P2530[SHOI2001]化工厂装箱员题目描述118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不... 查看详情

题解shoi2001化工厂装箱员

————传送:洛谷P2530这道题目还是挺简单的,状态也容易想到。数据范围非常的小,所以即便是很多维度,复杂度也完全可以接受。定义状态:dp[i][a][b][c]为手上的货物拿到第i个时三种物品分别有a,b,c个所用的最少次数。状... 查看详情

洛谷p2527[shoi2001]panda的烦恼

题目描述panda是个数学怪人,他非常喜欢研究跟别人相反的事情。最近他正在研究筛法,众所周知,对一个范围内的整数,经过筛法处理以后,剩下的全部都是质数,不过panda对这些不感兴趣,他只对被筛掉的数感兴趣,他... 查看详情

洛谷p2530[shoi2001]化工厂装箱员

题目描述118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱... 查看详情

p2530[shoi2001]化工厂装箱员(代码片段)

题目描述118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱... 查看详情

luogup2161[shoi2009]会场预约(代码片段)

题目地址题目链接题解用fhqtreap对区间进行维护。可以注意到的是,对于当前存在的预约,他们一定是升序排列的(有重叠的都被删了)。那么就可以用按照位置分裂的fhqtreap搞了(预约无论按l还是按r都必定是升序的)。每次插... 查看详情

bzoj4596/luogup4336[shoi2016]黑暗前的幻想乡(矩阵树定理,容斥)(代码片段)

bzoj4596/luoguP4336[SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)bzojLuogu题解时间看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理。但是要求每条边都属于不同公司就很难直接实现。按套路上容斥:如果直接将几个公司的修... 查看详情

[luogup2224][hnoi2001]产品加工(背包dp)

传送门 f[i][j]表示第一个机器耗时j,第二个机器耗时f[i][j]第一维可以滚掉#include<cstdio>#include<cstring>#include<iostream>#defineINF1e9#definemin(x,y)((x)<(y)?(x):(y))#definemax(x,y)((x)>(y)?(x):(y)) 查看详情

pkuwc前的任务计划

菜鸡wxw的计划(肯定会咕咕咕12.27luoguP4244[SHOI2008]仙人掌图IIluoguP4246[SHOI2008]堵塞的交通luoguP1848[USACO12OPEN]书架Bookshelf 查看详情

[题解]luogup4284[shoi2014]概率充电器(代码片段)

https://www.luogu.com.cn/problem/P4284比较套路的概率题?由期望的线性性可以把每个点拆开来,然后答案就是每个点通电的概率之和。通电的概率并不怎么好算,我们可以算点(u)不通电的概率(f[u]),然后答案就是[sumlimits_i=1^n1-f[i]]发现... 查看详情