首页 > 其他分享 >CF1770D Koxia and Game 题解

CF1770D Koxia and Game 题解

时间:2022-12-31 19:11:06浏览次数:67  
标签:基环树 int 题解 ++ Game 自环 ans Koxia mod

47min 时过 C 降智 50min 做不出 D。果然晚上容易降智。

题意不想复述,好长。

link to CF | link to Luogu

合理猜测留给后手的两个数字必须相等。证明为若不相等,则后手可以把最终的数列换掉一个数字,一定能打破排列的性质。

因此若 \(a_i=b_i\),则 \(c_i\) 可以随便取;否则 \(c_i=a_i\) 或 \(c_i=b_i\)。则方案数等于在只看 \(a_i \neq b_i\) 的选择中取出一个排列(预先取出 \(a_i=b_i\) 的数字)的方案数,再乘上 \(n^{\text{自由元的个数}}\)。

注意到这个规则挺弱,可以交换任意两条的顺序,也可以交换 \(a_i\) 和 \(b_i\),可以建个无向图来显示这个性质。

然后赛场降智开始写大分讨。调不出来,存在解判不存在。

考虑观察图的性质,这是带自环基环树森林。单拎一个基环树出来看看,则需要把每条边(除自环)定向让每个点入度恰为 \(1\)。

对于非环上的边,定向方向是唯一的,即远离环的方向;而环上的边有两种定向方法,除非是自环。

至此,逐一看每个连通块,若非基环树则无解;否则,判断是否有自环,无自环则对答案贡献 \(2\),否则贡献 \(n\)。

#include <cstdio>
#include <vector>
using namespace std;
const int M = 1e5 + 5, mod = 998244353;
int fa[M], n, sm[M], ans, siz[M], ec[M];
void init(int n) {
    for(int i = 1; i <= n; i++)
        fa[i] = i, sm[i] = 0, siz[i] = 1, ec[i] = 0;
}
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
void merge(int u, int v) {
    u = find(u); v = find(v);
    if(u != v) fa[u] = v, sm[v] += sm[u], siz[v] += siz[u];
}
int main() {
    int t; scanf("%d", &t);
    while(t--) {
        int n; scanf("%d", &n);
        vector<int> a(n), b(n);
        init(n);
        for(int i = 0; i < n; i++) scanf("%d", &a[i]);
        for(int i = 0; i < n; i++) scanf("%d", &b[i]);
        int cnt = 0, cnt2 = 0; 
        for(int i = 0; i < n; i++) {
            if(a[i] == b[i]) ++cnt, sm[a[i]] = 1;
        }
        for(int i = 0; i < n; i++) merge(a[i], b[i]);
        for(int i = 0; i < n; i++) {
            ++ec[find(a[i])];
        } 
        int ans = 1;
        for(int i = 1; i <= n; i++) {
            if(fa[i] != i) continue;
            if(ec[i] != siz[i]) ans = 0;
            else if(sm[i] > 0) ans = 1ll * ans * n % mod;
            else ans = 1ll * ans * 2 % mod;
        }
        printf("%d\n", ans);
    }
}

标签:基环树,int,题解,++,Game,自环,ans,Koxia,mod
From: https://www.cnblogs.com/purplevine/p/17017116.html

相关文章

  • 洛谷 P2395 BBCode转换Markdown 题解
    洛谷P2395BBCode转换Markdown题解题目传送门:here.一道毒瘤的大模拟,给了你一部分的BBCode和Markdown语法,叫你转换。如下表:BBCodeMarkdown[h1]文字[/h1......
  • Codeforces Good Bye 2022 CF 1770 A~E 题解
    题目链接A.KoxiaandWhiteboards注意每一步替换操作都是强制的,而不是可选的。所以就用一个multiset维护所有的数,每次选一个最小的替换掉即可。时间复杂度\(O(nlogn)\)......
  • P4247 [清华集训2012]序列操作 题解
    线段树练手好题。直接上线段树五问:维护的信息是什么?由于\(c\le20\),我们不妨对线段树的每个节点维护一个\(f_k\)表示在对应区间里选择\(k\)个数相乘的所有方案的和......
  • 题解 CF1770B【Koxia and Permutation】
    \(k=1\)的情况是平凡的。\(k>1\)的情况,显然答案至少为\(n+1\),下面给出构造证明\(n+1\)总可以取到。可以构造\(p=[n,1,n-1,2,n-2,3,\cdots]\),此时以\(n\)作为最......
  • 题解 CF1770C【Koxia and Number Theory】
    显然,如果存在\(a_i=a_j\),则一定无解。否则,考虑每一个\(2\sim50\)的正整数\(k\),如果原数组每个数对\(k\)取模后,每种余数都出现至少两次,则无解。因为此时无论如何选......
  • 【题解】P5574 [CmdOI2019]任务分配问题
    stocmd学长orz题意P5574[CmdOI2019]任务分配问题给定一个长度为\(n\)的排列,试将它分成\(k\)段,使得每段的顺序对数量之和最小。\(n\leq2.5\times10^4,k\l......
  • 【题解】P1912 [NOI2009] 诗人小G
    题意多测。给定\(n\)个字符串和一个常数\(L\),试将这些字符串分成若干组,使得:令\(len(i)\)为第\(i\)个字符串的长度,则每组字符串的\(|\sum\limitslen(i)-L|\)......
  • 【题解】P3158 [CQOI2011]放棋子
    兄弟们,我起了,一日之计在于晨呐。题意P3158[CQOI2011]放棋子有一个\(n\)行\(m\)列的棋盘和\(c\)种颜色的棋子,每种棋子有\(a_i\)个。要求不同颜色的棋子不能放......
  • HDU 6801 Game on a Circle 题解 (推式子,多项式)
    题目链接首先注意到我们对这个环的扫描是一轮一轮进行的,每轮都会从左到右对每个没被删除的元素以p的概率删除。如果我们能对每个\(t(t\in[0,\infin],t是整数)和i\)求出c......
  • [ABC221D] Online games
    [ABC221D]Onlinegames难度:\(832\)标签:差分离散化\(\mathtt{blog}\)有\(n\)个区间\([a_i,a_i+b_i)\),问各被\(1\simn\)个区间覆盖的数字个数有多少个。\(n\le......