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

P10693 [SNCPC2024] 换座位

时间:2024-07-22 15:53:37浏览次数:6  
标签:g2 SNCPC2024 P10693 出度 back int MAXN 编号 座位

本题考虑建图转化为图论问题,把每个嘉宾向其心仪座位连边,样例如下。
image
不难发现编号小于等于 \(n\) 的点出度一定为 \(1\),当一个联通块内全是编号小于等于 \(n\) 时,这个联通块有 \(n\) 条边;否则有 \(n-1\) 条边。因此这张图一定是一个有向基环树和有向树构成的森林。

对于有向树,我们遍历所有大于 \(n\) 小于等于 \(2n\) 的点,求出树上最长链边数,由于编号大于 \(n\) 的点出度为 \(0\),所以我们考虑建一张反图,方便 dfs 求解。

对于有向基环树,只能是环上的所有点,不然存在嘉宾没有地方坐,找环可以使用拓扑排序。

代码(参考了洛谷题解):

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+10;
vector<int>g1[MAXN],g2[MAXN];//图和反图
bool vis[MAXN];//标记
int ind[MAXN];//入度
int a[MAXN];
int n;
int maxn=0;
void dfs(int u,int fa,int now){
    if(u<=n){
        maxn=max(maxn,now);
        vis[u]=true;
        //不应return
    }
    for(auto v:g2[u]){
        if(v==fa)continue;
        dfs(v,u,now+1);
    }
}
int ans=0;
signed main(){
    cin>>n;
    for(int i=1;i<=2*n;i++){
        cin>>a[i];
        g1[i].push_back(a[i]);
        g2[a[i]].push_back(i);
        ind[a[i]]++;
    }
    for(int i=n+1;i<=2*n;i++){//计算有向树
        maxn=0;
        dfs(i,0,0);
        ans+=maxn;
    }
    queue<int>q;
    for(int i=1;i<=n;i++){
        if(ind[i]||vis[i])continue;
        q.push(i);
    }
    while(q.size()){//拓扑排序
        int u=q.front();
        q.pop();
        vis[u]=true;
        for(auto v:g1[u]){
            ind[v]--;
            if(!ind[v])q.push(v);
        }
    }
    for(int i=1;i<=n;i++)//找环
        if(!vis[i])ans++;
    cout<<ans;
    return 0;
}

标签:g2,SNCPC2024,P10693,出度,back,int,MAXN,编号,座位
From: https://www.cnblogs.com/FinderHT/p/18316166

相关文章

  • 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++源码题目描述在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。现在给出一排观众座位分布图,座位中存......
  • [SNCPC2024] 2024 年陕西省大学生程序设计 J题猜质数II 题解
    题目链接:CF或者洛谷PS:CF的得等上gym。前提说明其实在上个月就见到这题了,当时很想做这题,结果找不到做题链接,也不知道出处,原来是陕西省赛的捧杯题。个人评价觉得是一道很不错的题,难度适中。讲解其实题解写的挺不错的,比很多比赛的题解写的详细许多了。这里站在我的角度分......
  • 基于web网吧座位预约管理系统设计与实现
      博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-005 考试座位号
    L1-005考试座位号每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着......
  • 座位调整
    题目:疫情期间课堂的座位进行了特殊的调整,不能出现两个同学紧挨着,必须隔至少一个空位。给你一个整数数组adesk,表示当前座位的占座情况,由若干0和1组成,其中0表示没有占位,1表示占位。在不改变原有座位秩序情况下,还能安排坐几个人?输入描述:第一行是个子数组表示作为占座情况,由若干......
  • 27、座位表
    1、全选文字2、点击表格—【文本转为表格】—【点击确定】  【表格】—【表格选项】—【运行调整单元格间距】最后设置文字居中对齐就可以了  ......
  • 高校听课讲座预约座位系统uniapp+vue微信小程序
    讲座预约管理系统的用户是系统最根本使用者,按需要分析系统包括用户:学生、管理员。管理员通过后台的登录页面,选择管理员权限后进行登录,管理员的权限包括学生信息管理和文章公告管理。讲座公告管理,添加讲座公告信息,给学生发布一些学校的公告内容,为学习提前做准备,管理员管理后点......