首页 > 其他分享 >P10693 [SNCPC2024] 换座位

P10693 [SNCPC2024] 换座位

时间:2024-08-18 18:15:58浏览次数:6  
标签:心仪 嘉宾 SNCPC2024 P10693 200010 leq int 座位

[SNCPC2024] 换座位

题目描述

树王国在筹备着举办一次盛大的庆典!

Shirost 作为树王国的庆典设计师,准备邀请 \(n\) 个嘉宾来参加本次庆典。庆典上一共准备了 \(2n\) 个座位,一个座位最多只能坐一个人且一个人恰好坐一个座位。Shirost 初步计划将第 \(i\) 个嘉宾安排在第 \(i\) 个座位上。但是总统调查了这 \(n\) 个嘉宾的意愿,第 \(i\) 个嘉宾的心仪座位为第 \(a_i\) 个座位。但除非能坐到心仪座位上,否则他们只愿意坐在原来的座位上。总统希望 Shirost 能够修改计划,使得尽可能多的嘉宾坐在他们的心仪座位上。

形式化的讲,你需要找到长为 \(n\) 的数组 \(b_i\) (\(1 \leq i \leq n, 1 \leq b_i \leq 2n\)) 满足 \(\forall i \neq j,b_i \neq b_j\) 且 \(\forall i, b_i=i\) 或 \(b_i=a_i\)。且最大化 \(b_i = a_i\) 的个数。

你只需要输出最多的个数即可。

输入格式

输入第一行为一个整数 \(n\) (\(1 \leq n \leq 10^{5}\)),表示总人数。

第二行 \(n\) 个整数 \(a_i\) (\(1 \leq a_i \leq 2n\)),由空格隔开,表示每个人的心仪座位。

输出格式

输出仅一行一个整数,表示最多有多少嘉宾坐在他们的心仪座位上。

样例 #1

样例输入 #1

5
2 6 4 5 3

样例输出 #1

5

提示

所有人都可以换到自己的心仪座位。

思路

#include<bits/stdc++.h>
using namespace std;
int n,ans = 0;
int a[200010],b[200010]; 
vector<int> g[200010],f[200010];
int bfs(){
	queue<int> q;
	for(int i = 1;i <= n;i ++){
		if(!b[i] && !a[i]){
			q.push(i);
		}
	}
	while(!q.empty()){
		int x = q.front();
		q.pop();
		b[x] = 1;
		for(int i = 0;i < g[x].size();i ++){
			a[g[x][i]] --;
			if(!a[g[x][i]]){
				q.push(g[x][i]);
			}
		}
	}
	int sum = 0; 
	for(int i = 1;i <= n;i ++){
		if(!b[i]){
			sum ++;
		}
	}
	return sum;
}
int maxx = 0;
void dfs(int x,int y){
	if(x <= n){
		maxx = max(maxx,y);
		b[x] = 1;
	}
	for(int i = 0;i < f[x].size();i ++){
		dfs(f[x][i],y + 1);
	}
	return ;
}
int dfsans(){
	int sum = 0;
	for(int i = n + 1;i <= n * 2;i ++){
		maxx = 0;
		dfs(i,0);
		sum += maxx;
	}
	return sum;
}
int main() {
	scanf("%d",&n);
	for(int i = 1,aa; i <= n; i ++) {
		scanf("%d",&aa);
		a[aa] ++;
		g[i].push_back(aa);
		f[aa].push_back(i);
	}
	ans = dfsans() + bfs();
	printf("%d\n",max(ans,0));
	return 0;
}

标签:心仪,嘉宾,SNCPC2024,P10693,200010,leq,int,座位
From: https://www.cnblogs.com/zqhbxsgs/p/18365898

相关文章

  • P10703 [SNCPC2024] 窗花
    [SNCPC2024]窗花题目描述有一扇\(100\text{cm}\times100\text{cm}\)的窗户和\(n\)个对角线长为\(2\text{cm}\)的正方形窗花。建立坐标系,以窗户左下角的坐标为原点\((0,0)\),右上角坐标为\((100,100)\),第\(i\)个窗花中心被贴在非边缘的整坐标点\((x_i,y_i)\)(\(......
  • [开题报告]FLASK框架图书馆座位预约系统oj14m(源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校教育规模的不断扩大,图书馆作为知识资源与学习空间的核心,其座位资源的有效管理日益成为关注焦点。传统的先到先得模式不仅容易导致......
  • 微信小程序图书馆座位预约管理系统(SpringBoot后端+Vue管理端)附项目源码与配套文档
    目的和意义微信小程序图书馆座位预约管理系统可以对微信小程序图书馆座位预约管理系统信息进行集中管理,可以真正避免传统管理的缺陷。微信小程序图书馆座位预约管理系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和......
  • 免费分享一套微信小程序图书馆座位预约管理系统(SpringBoot后端+Vue管理端)【论文+源
    大家好,我是java1234_小锋老师,看到一个不错的微信小程序图书馆座位预约管理系统(SpringBoot后端+Vue管理端),分享下哈。项目介绍随着移动互联网技术的飞速发展和智能设备的普及,图书馆服务模式正在经历深刻的变革。本论文旨在探讨如何利用微信小程序这一便捷高效的平台,开发一款......
  • 2024 ICPC ShaanXi Provincial Contest 换座位 sol
    \(\text{Link}\)自然地想到\(i\)向\(a_i\)连边。随便造一组强一点的数据:103121010892082图大概长这样容易发现每个\(i\)有且仅有\(1\)条出边。发现图中\(1,2,3\)这\(3\)个点组成了一个环。在这个环上,每个人都能做到自己心仪的位置上,所以这个环对......
  • P10693 [SNCPC2024] 换座位
    本题考虑建图转化为图论问题,把每个嘉宾向其心仪座位连边,样例如下。不难发现编号小于等于\(n\)的点出度一定为\(1\),当一个联通块内全是编号小于等于\(n\)时,这个联通块有\(n\)条边;否则有\(n-1\)条边。因此这张图一定是一个有向基环树和有向树构成的森林。对于有向树,我们......
  • P10693 撅个题
    P10693撅个题这个题是一个比较神奇的图论题首先我们看到题面是这样描述的,第$i$个人想坐$a_i$个位置,于是$i$对$a_i$连边手玩个样例会发现,我们建出来的图有以下性质:前$n$个点往外连边,后$n$个点不往外连边可能会存在环每个点只会往外连至多一条......
  • 洛谷P10693
    洛谷P10693好奇怪的题目编号题面\(n\)个人,\(2n\)个座位,每个人都有心仪的座位,如\(i\)心仪的座位为\(a_i\)(可重复),设计师设计让他们坐在自己编号的位置上,即\(i\)做到\(i\),每个人只可以做\(a_i\)或\(i\),最多多少个人坐到心仪的座位。思路提取input11213453799111112......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日派对座位安排(200分) - 三
    ......
  • 华为OD机试D卷 --找座位--24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析java源码python源码javascript源码c源码c++源码题目描述在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。现在给出一排观众座位分布图,座位中存......