首页 > 其他分享 >Exact Neighbours (Medium)

Exact Neighbours (Medium)

时间:2024-07-07 14:41:09浏览次数:16  
标签:Medium int Exact 构造 房子 Neighbours 一列 配对 id

官解的方法二就是这篇博客(注意要先将\(a\)从小到大排序),补充一下,博客中说当\(a_j-j+1<0\)时,我们就找第\(j-a_j\)列的那个房子即可

我在做的时候,也想到了逐个构造的方法,然而我在构造新的一列时,却总是想让这一列的房子与前一列的房子来配对,事实证明,我们构造的时候不要拘泥于数学归纳法,可以从强数学归纳的思想出发,去找前面所有构造好了的房子

官解的方法一没有看懂英文是啥意思

我的方法与上述两种方法都不同:

显然\(1\)号房子是最特殊的,所以我们将其放在\((1,1)\),然后我们采用逐个构造法,发现如果存在两个\(a\)相同的房子就不太好构造,于是我们将相同的房子两两配对,并且从最后一列依次往前面放(显然合法),最后剩下的还没有配对的房子的\(a\)都不同,于是尝试将其与\(1\)号房子配对,注意此时第二列的距离可以放\(1\)到\(n\),第三列的距离可以放\(2\)到\(n\),依次类推,于是我们将剩下的房子排序,显然从小到大依次放置就合法;具体见以下代码,非常easy

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
const ll mod=998244353;
int n;
bool mark[N];
struct node
{
	int id,a;//id表示房子的编号,a如题目所述 
}t[N];
struct Node
{
	int x,y,to;//(x,y)是房子的坐标,to是与其配对的房子编号 
}ans[N];
bool cmp(node i,node j)
{
	if(i.a==j.a) return i.id<j.id;
	return i.a<j.a;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) 
	{
		t[i].id=i;
		scanf("%d",&t[i].a);
	}
	sort(t+1,t+n+1,cmp);
	for(int i=2,last=n;i<=n;i++)//last表示最后的还没有放置房子的列,我们从后往前依次放置 
	if(t[i].a==0)//注意0的单独放置一列就好了 
	{
		ans[t[i].id].x=last--,ans[t[i].id].y=1;
		ans[t[i].id].to=t[i].id;
		mark[i]=1;
	}
	else if(t[i].a==t[i-1].a)
	{
		ans[t[i].id].x=last--,ans[t[i].id].y=1;
		ans[t[i-1].id].x=last--,ans[t[i-1].id].y=t[i].a;
		ans[t[i].id].to=t[i-1].id,ans[t[i-1].id].to=t[i].id;
		mark[i]=mark[i-1]=1;
		i++;
	}
	ans[1].x=ans[1].y=ans[1].to=1;
	for(int i=2,last=2;i<=n;i++)
	if(!mark[i])
	{
		ans[t[i].id].x=last++,ans[t[i].id].y=t[i].a-ans[t[i].id].x+2;
		ans[t[i].id].to=1;
	}
	puts("YES");
	for(int i=1;i<=n;i++)
	printf("%d %d\n",ans[i].x,ans[i].y);
	for(int i=1;i<=n;i++) printf("%d ",ans[i].to);
	return 0;
}

标签:Medium,int,Exact,构造,房子,Neighbours,一列,配对,id
From: https://www.cnblogs.com/dingxingdi/p/18288492

相关文章

  • [题解]AT_abc267_f [ABC267F] Exactly K Steps
    大家好,我是毒瘤,喜欢用玄学算法过题。发现题解区没有这个做法,于是来发一篇。思路不难发现如果一个点对\((u,v)\)的距离为\(d\),那么在这棵树以\(u\)为根时,\(v\)的深度为\(d\)。于是考虑换根DP。首先思考如何计算答案。显然我们可以将查询离线下来,然后当换根到以\(u\)......
  • stable-diffusion-3-medium 大模型下载地址
    由于huggingface.co下载速度不佳,放在夸克网盘上了:https://pan.quark.cn/s/6ab1885c2e51 有条件的可以从huggingface下载:https://huggingface.co/stabilityai/stable-diffusion-3-medium/tree/main StableDiffusion3Medium是基于OpenAI的扩散模型理论基础之上发展的......
  • 2938. 区分黑球与白球 Medium
    桌子上有 n 个球,每个球的颜色不是黑色,就是白色。给你一个长度为 n 、下标从 0 开始的二进制字符串 s,其中 1 和 0 分别代表黑色和白色的球。在每一步中,你可以选择两个相邻的球并交换它们。返回「将所有黑色球都移到右侧,所有白色球都移到左侧所需的 最小步数」。......
  • SSL Medium Strength Cipher Suites Supported (SWEET32)漏洞修复
    近期对公司开发环境的机器进行了安全扫描,在扫描安全报告中出现了SSLMediumStrengthCipherSuitesSupported(SWEET32)漏洞,汇报后领导表示需要进行修复,特记录此漏洞修复的过程。漏洞产生的原因漏洞的原因主要是由于SSL/TLS协议中使用的DES(DataEncryptionStandard)及Trip......
  • 『Solution』Codeforces 1970B Exact Neighbours
    Easy没什么启发性,直接考虑Medium。考虑到\(a_1=0\),那么\(1\)明显直接和自己配对就行,考虑分配到一个特殊的位置\((1,1)\)。接下来考虑如果还有\(a_i=0\),那么明显\(i\)也是和自己配对,此时因为这是无关紧要的就可以离特殊的\((1,1)\)尽量远一点,也就是让\(x\)坐......
  • CF1591F Non-equal Neighbours
    题面:thissolution:容斥神仙题qwq考虑全集-补集,此时补集就是一些集合的并,可使用容斥设至少\(j\)个点满足\(b[i]==b[i+1]\)时方案数为\(f_j\)直接求不好求,考虑转化:有\(j\)个点时就把原序列隔成了\(n-j\)段,段内无所谓,但是用于分割的之间的段需要一样此时自然而然的......
  • Vue基础知识:声明式导航---导航链接router-link,router-link是什么,怎么用?router-link-ac
    router-link是什么?vue-router提供的一个全局组件,router-link(用于取代a标签)router-link怎么用?router-link的好处?1.能够跳转,能高亮(自带激活时的类名)1.能跳转,配置to属性指定路径(必须)。本质还是a标签,to不需要多加#既然已经有了a标签,为什么还有加一个router-link标签呢?......
  • Quill文档(四):使用Parchment克隆Medium
    为了提供一致的编辑体验,您需要一致的数据和可预测的行为。不幸的是,DOM缺乏这两个特性。现代编辑器的解决方案是维护自己的文档模型来表示它们的内容。对于Quill来说,Parchment就是这样的解决方案。它在自己的代码库中组织,并拥有自己的API层。通过Parchment,您可以定制Quill识别......
  • hackthebox carrier medium
    ReconNMAPSCANnamp-sT-p---min-rate1000-oAnmap/ports10.10.10.10522/tcpopenssh80/tcpopenhttpnmap-sT-pxx,xx-sV-oAnmap/version10.10.10.105nmap-sU-p---min-rate1000-oAnmap/udp10.10.10.105port161/udpopensnmpnmap-sU-pxx-sV-oA......
  • Medium Design
    思路一:见这篇题解,当然只用看step3之后的就好了思路二:我使用的是转换对象法。从线段的角度不好考虑,我们从元素的角度考虑如果我们已经确定了一个元素\(a_i\)为最大值,我们考虑所有线段如果一个线段不包含\(a_i\),那么肯定不选择,因为他不会让最大值增加,反而可能会让最小值增加如......