首页 > 其他分享 >P2765 魔术球问题&&二分图

P2765 魔术球问题&&二分图

时间:2024-12-29 17:42:04浏览次数:8  
标签:二分 此题 标记 int mid 魔术 maxn && P2765

题意

here

思路

1

根据此题输入m的范围,可以知道此题的答案上限约为5000
考虑逆向二分求解(实际上可以直接枚举)

2

此题可以抽象成在图上求最少链的个数
我们把所有数向比他大的、与他的和为平方数的数建边
可以看出是二分图最大匹配问题
结合图更清晰:

此时图上最少链的个数为
\(n\)(点数)\(- ans\)(最大匹配数)即\(6-3=3\)
这三条链分别为:
1 3 6
4 5
2
可以看作从 \(1\) 开始,不断在从左边跳到右边

  • 左边的 1 连接了右边的 3,这条链上有\(1 3\)。3已经被加到一条链中,标记一下,再遍历到 3 时直接跳过
    左边的 3 又连接到了右边的 6,这条链就变成了\(1 3 6\) 标记 6
  • 左边的 2 没有连接右边的点,这条链上只有 \(2\)
  • 遍历到 3,3 已经被标记,continue
  • 4 连接了 5,标记 5,此时这条链变为 \(45\)
  • 5 被标记,continue
  • 6 被标记,结束。

代码:

#include<bits/stdc++.h>

using namespace std;

const int maxn=5005;

int m;
vector<int>g[maxn*2];
int result[maxn*2];
int mm[maxn*2];
bool vis[maxn*2];

bool dfs(int p)
{
	for(int j=0;j<g[p].size();j++)
	{
		if(!vis[g[p][j]]){
			vis[g[p][j]]=true;
			if(result[g[p][j]]==0||dfs(result[g[p][j]]))
			{
				result[g[p][j]]=p;
				mm[p]=g[p][j];
				return true;
			}
		}
	}
	return false;
}

bool is_sqre(int p)
{
    int t = sqrt(p); 
    if(t * t == p){
        return true;
    }
    return false;
}

bool check(int n)
{
	memset(mm,0,sizeof(mm));
	int ans=0;
	for(int i=1;i<=n;i++)
		g[i].clear();
	memset(result,0,sizeof(result));
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			if(is_sqre(i+j)) g[i].push_back(j);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(dfs(i)) ans++;
		memset(vis,false,sizeof(vis));
	}
	if(n-ans>m) return false;//需要更多的柱子 
	else return true;
}

int main()
{
	cin>>m;
	int l=1,r=5000;
	while(l<r){
		int mid=(l+r)>>1;
		if(check(mid)) l=mid+1;
		else r=mid;
	}
	cout<<l-1<<endl;
	for(int j=1;j<=l-1;j++)
	{
		if(!vis[j])
		{	
			for(int i=j;i;i=mm[i])
			{
				cout<<i<<" ";
				vis[i]=true;
			}
			cout<<endl;
		}
	}
	return 0;
} 

标签:二分,此题,标记,int,mid,魔术,maxn,&&,P2765
From: https://www.cnblogs.com/lazy-ZJY0307/p/18639291

相关文章

  • 魔术方法
    魔术方法new()new()被用来创建一个类的实例对象Python中,创建一个新的实例一般是通过调用类的构造函数__init__()来完成的。然而,类名()创建对象时,在自动执行__init__()方法前,会先执行object.__new__方法,在内存中开辟对象空间并返回该对象。然后,Python才会调用__init__()......
  • 魔术方法
    #类的内置方法,也叫双下方法、魔术方法#__call__实例化对象加上(),可以触发这个类的__call__方法,类似实例化时自动执行的__init__()classF1():def__call__(self,*args,**kwargs):print('call')f1=F1()f1()#call#__eq__判断对象是否相等class......
  • 魔术方法
    定制化属性访问###getattribute(self,name):被称作属性拦截器,即所有对实例属性的访问都会先受到此方法的影响。此方法应该返回一个我们处理后的值,或者抛出一个AttributeError异常。此方法应该谨慎使用。一般我们对个别属性做特殊处理后,都要加一个调用父类该方法,以免无限递归......
  • 揭秘Python中的二维码魔术师:qrcode库的魔法
    文章目录揭秘Python中的二维码魔术师:qrcode库的魔法背景:为什么选择qrcode库?库简介:qrcode是什么?安装指南:如何将qrcode库纳入你的Python环境?快速入门:5个简单函数的使用方法1.生成基本二维码2.生成带有Logo的二维码3.生成彩色二维码4.自定义二维码大小5.生成二维码并直......
  • Swift 中的影像魔术:Core Video 的高级应用
    标题:Swift中的影像魔术:CoreVideo的高级应用在Swift开发中,CoreVideo是Apple提供的一个强大的框架,用于处理高质量的视频内容。从实时视频滤镜到高级图像处理,CoreVideo为开发者提供了丰富的API来实现各种视觉效果。本文将详细介绍如何在Swift中使用CoreVideo......
  • 使用光影魔术手的色彩调整功能,让你的照片更具活力
    前言你是否曾经因为处理繁琐的照片而感到无从下手?是否在忙碌的工作中想要快速修整图片,却因为复杂的软件操作而拖延了时间?光影魔术手就是为了解决这些问题而诞生的。它不仅是一款功能强大的批量图像处理工具,更是一位高效的助手,帮助你在繁忙的工作中节省宝贵的时间,提高办公效率,......
  • PHP中的魔术常量(如__FILE__,__LINE__)及其用途
    在PHP中,魔术常量是一组预定义的常量,它们会根据它们使用的上下文环境而改变其值。这些常量以两个下划线字符开始和结束。魔术常量提供了有关代码执行环境的有用信息,例如当前文件的路径、当前行号等。以下是几个常用的PHP魔术常量及其用途:__FILE__:用途:__FILE__ 魔术常量返......
  • 魔术上网导致Github push 443 问题解决方法
    问题描述使用“kexue上网”工具后,在IDEA中push代码到github时,报错:Failedtoconnecttogithub.comport443:Operationtimedout。同时,使用浏览器访问github也会出现无法访问,偶尔能访问的情况。解决办法gitconfig--globalhttp.proxyhttp://127.0.0.1:1087git......
  • IPython的跨界魔术:%%javascript命令深度解析
    IPython的跨界魔术:%%javascript命令深度解析IPython,作为Python编程的强大交互式工具,提供了多种魔术命令来扩展其功能。其中,%%javascript魔术命令允许用户在IPythonNotebook中直接执行JavaScript代码,打通了Python和JavaScript两个世界,为数据可视化、Web内容操作等提供了便......
  • IC-Light:革新的AI光影魔术师,重塑图像的灵魂之光
    探索IC-Light:一款革命性的AI图像照明工具IC-Light,全称为“ImposingConsistentLight”,是一款由AI图像处理专家张吕敏(ControlNet的作者)精心开发的创新工具。主要用于控制图像光源效果,它利用先进的机器学习技术,为图像照明领域带来了前所未有的便利与创意空间。目前,发布了两种类......