首页 > 其他分享 >P10693 撅个题

P10693 撅个题

时间:2024-07-22 14:57:24浏览次数:10  
标签:个题 200005 int P10693 back 个点

P10693 撅个题

这个题是一个比较神奇的图论题

首先我们看到题面是这样描述的,第 $ i $ 个人想坐 $ a_i $ 个位置,于是 $ i $ 对 $ a_i $ 连边

手玩个样例会发现,我们建出来的图有以下性质:

  1. 前 $ n $ 个点往外连边,后 $ n $ 个点不往外连边

  2. 可能会存在环

  3. 每个点只会往外连至多一条边

有了这些性质,我们会发现,这个图我们需要考虑到以下三种情况

  1. 对于一条链,他一定会连到后 $ n $ 个点去,但后 $ n $ 个点可能会连不只一条链,所以考虑最长的一条,取它的贡献

  2. 其他的部分就是一个基环树森林,即不只一个基环树,所以我们考虑拓扑排序,把非环部分删掉

  3. 把剩下点的数量加到答案里,这是环,环上的点都可以满足要求

所以我们就做完了

代码如下:

# include <bits/stdc++.h>

using namespace std;

int n;

vector < int > vec[200005], vec1[200005];

bool vis[200005];

int in[200005];

int res = 0, ans = 0;

queue < int > q;

inline void dfs (int u, int d) {

    if (u <= n) res = max (res, d), vis[u] = 1;

    for (int i = 0; i < vec1[u].size (); ++ i) {

        int v = vec1[u][i];

        dfs (v, d + 1);

    }

}

signed main () {

    cin >> n;

    for (int i = 1; i <= n; ++ i) {

        int x; cin >> x;

        vec[i].push_back (x);

        vec1[x].push_back (i);

        ++ in[x];

    }

    for (int i = n + 1; i <= 2 * n; ++ i) {

        res = 0;

        dfs (i, 0);

        ans += res;

    }

    for (int i = 1; i <= n; ++ i) if (! vis[i] && ! in[i]) q.push (i), vis[i] = 1;

    for (; ! q.empty (); ) {

        int u = q.front ();

        q.pop ();

        for (int i = 0; i < vec[u].size (); ++ i) {

            int v = vec[u][i];

            -- in[v];

            if (! in[v]) q.push (v), vis[v] = 1;

        }

    }

    for (int i = 1; i <= n; ++ i) if (! vis[i]) ++ ans;

    cout << ans << endl;

    return 0;

}

标签:个题,200005,int,P10693,back,个点
From: https://www.cnblogs.com/Tzf-tzf/p/18316006

相关文章

  • 洛谷P10693
    洛谷P10693好奇怪的题目编号题面\(n\)个人,\(2n\)个座位,每个人都有心仪的座位,如\(i\)心仪的座位为\(a_i\)(可重复),设计师设计让他们坐在自己编号的位置上,即\(i\)做到\(i\),每个人只可以做\(a_i\)或\(i\),最多多少个人坐到心仪的座位。思路提取input11213453799111112......
  • 开发一个题库系统App和小程序的心得
    序言对于一名开发者来说,独自开发一款小程序与App,也许总会有一些疑问: 1.需要掌握哪些技术?答:java、vue、及常规Linux命令 2.需要多少成本?答:服务器购买,云服务器新人50多三年;域名购买,10块的域名够用,后续每年30左右的续期费用;短信套餐购买,50块钱,够用很久了;微信小程序发布,......
  • YC307B [ 20240625 CQYC省选模拟赛 T2 ] 一个题(ynoi)
    题意你需要维护一个可重集\(S\),支持插入删除以及查询最大的方案使得给定正整数\(k\),划分为\(k\)个非空子集的按位与结果之和最大。\(n\le10^5\)Sol先上个trie。然后考虑一次查询怎么搞。先转化一下,如果需要划分为\(k\)个子集,显然需要合并\(n-k\)次。我们只......
  • 软件测试|面试常见十个题目(附答案),收藏好!
    金三银四的求职季如期而至,如何在这场求职大战中脱颖而出,斩获心仪的职位,前提是要做好充足的准备!接下来跟大家分享学员在面试中经常被问到的十大问题,希望对大家有启发和帮助。需要更多题库资料,简历优化辅导的话亦可联系上老师:flyhappy1111、请介绍一下你最近测试的项目举例最......
  • Vue面试不得不会的20个题——第三篇
    13.Vue中的混入(Mixins)是什么?Vue中的混入(Mixins)是一种分发Vue组件中可复用功能的非常灵活的方式。混入对象是一个包含组件选项的对象,可以包含data、components、created、methods、computed、watch等等。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。......
  • 帮忙看下这个题的Python代码咋写
    双11商品调配问题某电商企业有4个中心库、20个一级分拨中心。采购的商品分布到4个中心库,然后由中心库向一级分拨中心发货。为备战双11销售高峰。各中心库集中采购备货,备货量和各分拨中心订货量和各分拨中心到中心库的距离如下表:受天气影响,中心仓库4到分拨中心8-11无法调拨。......
  • ACM校赛的几个题
     c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343给大家分享一句我很喜欢我话:知不足而奋进,望远山而前行!!!铁铁们,成功的路上必......
  • 7-15 报数(留个题目,还没写代码)
    7-15报数分数10作者王秀单位福州大学输入两个正整数n和m((1<m<n<=50)),有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数m的人退出圈子,下一个人从1开始重新报数,报数m的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号......
  • 一个题
    http://zhengruioi.com/contest/1537/problem/2825一共只有两次操作机会,那么最后一次我们肯定选择所有\(p_i\not=i\)。先假设所有点都在第二次操作(花费\(b_i\)),然后,考虑在第一次操作提前将某些球归位(使得\(p_i=i\))。如果要归位球\(i\),设\(pos_i\)为放置球\(i\)的盒子的......
  • 两个题目
    1\(u,v\inR^n\),矩阵\(A=I+uv^T\),投影算子\(P=I-uu^T/u^Tu\),SM公式\(M=A-uv^T,M^{-1}=A^{-1}+A^{-1}uv^TA^{-1}/(1-v^TA^{-1}u)\)1、证明:矩阵A的逆是\(A^{-1}=I+auv^T\),并求出a关于u、v的表达式;2、证明:\(<pv,u>=0\);3、请说明SM公式中分子如何结合,计算复杂度\(O(n)\),\(u^Tv\)......