QOJ.ac

QOJ

Time Limit: 3 s Memory Limit: 1024 MB Total points: 150

#4083. 아이싱

Statistics

在众多中小学生中,一款名为 아이싱 的在线一对一对战游戏正在流行。游戏公司在此基础上进行了扩展,开发了支持团队对战的 아이싱 II,可以让 Team I 和 Team Sing 之间进行对战。

아이싱 II 的设计利用了玩家在原有 아이싱 中的一对一对战历史,以一种独特的方式来组建队伍。也就是说,在 아이싱 中进行过一对一对战的两名玩家,必须被分到不同的队伍中。每个队伍的人数至少为 1 人,两个队伍的人数可以不同。

然而,距离 아이싱 II 服务器开启只剩 3 分钟时,却发现了一个致命问题。例如,如果玩家 A、B、C 之间两两都进行过对战,那么他们必须分别进入不同的队伍,从而无法只用 Team I 和 Team Sing 这两个队伍来完成分组。

为了解决这个问题,打算采用如下方法:删除最少数量的对战记录。但是,由于距离游戏上线只剩 3 分钟,可删除的对战记录数量最多只能是 2 条。如果必须删除 3 条或更多的记录,那么推迟上线可能反而更好。

在这种情况下,公司代表好奇的是:在能够构成两支队伍的前提下,最小删除规模的对战记录集合一共有多少种不同的选择方式。 也就是说,当最少需要删除的对战记录数量为 $K$ 时,需要计算大小为 $K$ 的、可删除的对战记录子集的个数。

你需要根据给定的 아이싱 对战记录,实现下面的函数,用来计算在可以构成两支队伍的前提下,选择最少数量对战记录进行删除的不同方法数。 删除对战记录的顺序不重要。

另外,如果即使删除不超过 2 条对战记录也无法进行游戏,则返回 0。 如果根本不需要删除任何记录,那么“不删除任何记录”是最快且唯一的方法,因此方法数为 1。

函数说明

long long count_ways( int N, vector<int> U, vector<int> V );

其中,$N$ 为玩家人数,$U$ 和 $V$ 为大小为 $M$ 的向量,表示在玩家 $U_i$ 与玩家 $V_i$ 之间存在一条 아이싱 对战记录。 函数需要返回在满足条件的情况下,删除最少数量对战记录的不同方法数。如果必须删除 3 条或以上记录,则返回 0。

实现细节

你必须提交一个名为 ising.cpp 的文件,其中实现如下函数:

long long count_ways( int N, vector<int> U, vector<int> V );

该函数应按照上述说明正确运行。当然,你可以自行定义并使用其他辅助函数。 提交的代码不得进行输入输出操作,也不得访问其他文件。

Grader 说明

给定的 grader 会按照如下格式读取输入:

  • 第 1 行:$N\ M$ ($N$:玩家人数,$M$:아이싱 对战记录数量)
  • 第 $2+i$ 行($0 \le i \le M-1$):$U_i\ V_i$ (表示玩家 $U_i$ 与玩家 $V_i$ 之间的一条 아이싱 对战记录)

grader 会输出你在 count_ways() 函数中返回的结果。

限制

  • $3 \le N \le 250,000$
  • $N-1 \le M \le 250,000$
  • $1 \le U_i, V_i \le N$($0 \le i \le M-1$)
  • $U_i \ne V_i$
  • 若 $U_i = U_j$ 且 $V_i = V_j$,则 $i = j$ (不存在 $U_i = V_j$ 且 $V_i = U_j$ 的情况)
  • 任意两名玩家都通过对战记录相互连通 (可以是直接对战,或通过其他玩家的对战关系间接连通)

子任务

  • 子任务 1 [10 分]:$N \le 200,\ M \le 200$
  • 子任务 2 [23 分]:$N \le 5,000,\ M \le 5,000$
  • 子任务 3 [11 分]:$N \le 500$
  • 子任务 4 [25 分]:$N \le 5,000$
  • 子任务 5 [31 分]:$M - N \le 200$
  • 子任务 6 [50 分]:无额外限制

样例数据

输入样例 1

4 4
1 2
1 3
2 4
3 4

输出样例 1

1

函数调用及结果如下:

count_ways(4, {1, 1, 2, 3}, {2, 3, 4, 4}) = 1

输入样例 2

4 4
1 2
1 3
1 4
2 3

输出样例 2

3

输入样例 3

4 6
1 2
1 3
1 4
2 3
2 4
3 4

输出样例 3

3

输入样例 4

5 10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

输出样例 4

0

输入样例 5

12 16
1 2
2 3
3 4
4 1
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 5
1 5
2 7
3 9
4 11

输出样例 5

2

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.