[题解]Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) - A. Basic Diplomacy
【题目】
【描述】
Aleksey有n个朋友,有一个m天的假期,每天都需要一个朋友来陪他。给出每天有空的朋友的编号,要求同一个朋友来的天数不能超过m/2上取整。求是否有一个朋友到访的方案,没有输出“NO”,有输出“YES”并输出任意一种方案。
数据范围:1<=n,m<=100000,保证每天至少有一个朋友有空,共t组数据,1<=t<=10000
【思路】
这道题只要注意到“同一个朋友来的天数不能超过m/2上取整”的要求就很简单了。
首先,由于总天数是m,所以随意一种方案,最多就只有一个朋友来的天数超过了这个上界,我们不妨称这个来太多次的朋友为zyy;于是我们只需要让zyy少来几次就行了。
于是我们遍历zyy具体来的那些天,尝试替换成当天有空的别的朋友来;只需要替换到zyy来的天数恰好为m/2上取整就可以不再替换了。
然后我们来看看,如果上述替换能够成功(就是能够替换到zyy来的天数恰好为m/2上取整),新的方案能否满足要求?答案是肯定的。因为新方案中zyy一共来了m/2上取整天,剩余的m-(m/2上取整)天<=m/2上取整天,换言之即使剩余的每一天都是同一个人来,也是符合要求的。
而如果上述替换不能成功(就是无论如何调整,zyy来的天数都要多于m/2上取整),那么很显然没有符合要求的方案。
现在,我们来考虑替换方法。根据上述分析,聪明的读者已经发现,只要在zyy来的那些天里,找到足够的天数同时有别的朋友也有空就行了。于是我们遍历zyy具体来的那些天,一旦某一天有别的朋友有空,我们就让别的朋友替换zyy在那一天来,直到zyy来的天数恰好为m/2上取整,或者替换不成功;由于本题的上界是“不能超过m/2上取整”,保证了不会同时出现超限的两个朋友,也保证了不会让一个朋友符合要求而导致另一个朋友超限,于是遍历的顺序不会导致错误(所以顺序遍历就ok啦),替换成的别的朋友的选择也可以很随意(只要不是zyy就ok啦)。
以上就是本题的解题思路。但是,聪明的读者或许发现了一个小猫腻:只需记住每天有最多哪两个朋友有空就可以啦!这实际上也是由上界“不能超过m/2上取整”带来的小性质。
思路说清楚了,实现很简单,就不赘述了,不清楚可以参考一下下面的代码。每组的复杂度为O(m*n),也就是读数据的复杂度了。
(老年人zyy一开始没注意到上界“不能超过m/2上取整”的性质,一开始想贪心,觉得不对,又想要不还是搜索+剪枝吧,写到一半才发现这个性质,果然是脑子不行了……)
【我的实现】
复杂度:每组数据O(m*n)

1 //#define _CRT_SECURE_NO_WARNINGS
2
3 #include <iostream>
4 #include <cstdio>
5 #include <algorithm>
6 #include <cmath>
7 #include <string>
8 #include <cstring>
9 #include <cstdlib>
10 #include <vector>
11 #include <list>
12 #include <map>
13 #include <queue>
14 #include <stack>
15 #include <set>
16
17 #define PRO 'A'
18 //#define PRO 'B'
19 //#define PRO 'C'
20 //#define PRO 'D'
21 //#define PRO 'E'
22 //#define PRO 'F'
23 //#define PRO 'G'
24 //#define PRO 'H'
25 //#define PRO 'I'
26
27
28 using namespace std;
29
30 #if (PRO == 'A')
31
32 #define N 100000
33 #define M 100000
34
35 int cnt[N];
36 int fri[M][2], ans[M];
37
38
39 #endif // (PRO == 'A')
40
41 #if (PRO == 'B')
42
43 #endif // (PRO == 'B')
44
45 #if (PRO == 'C')
46
47 #endif // (PRO == 'C')
48
49 #if (PRO == 'D')
50
51 #endif // (PRO == 'D')
52
53 #if (PRO == 'E')
54
55 #endif // (PRO == 'E')
56
57 #if (PRO == 'F')
58
59 #endif // (PRO == 'F')
60
61 #if (PRO == 'G')
62
63 #endif // (PRO == 'G')
64
65 #if (PRO == 'H')
66
67 #endif // (PRO == 'H')
68
69 #if (PRO == 'I')
70
71 #endif // (PRO == 'I')
72
73
74 int main()
75 {
76 #if (PRO == 'A')
77 int T;
78 int n, m;
79 int i, j;
80 int tmp, tmp2;
81 int fri_num;
82
83 scanf("%d", &T);
84 while (T--) {
85 fri_num = -1;
86 memset(cnt, 0, sizeof(cnt));
87 scanf("%d%d", &n, &m);
88 for (i = 0; i < m; i++) {
89 scanf("%d", &tmp);
90 if (tmp == 1) {
91 scanf("%d", &fri[i][0]);
92 fri[i][1] = -1;
93 }
94 else {
95 scanf("%d%d", &fri[i][0], &fri[i][1]);
96 for (j = 2; j < tmp; j++) {
97 scanf("%d", &tmp2);
98 }
99 }
100 ans[i] = fri[i][0];
101 cnt[ans[i]]++;
102 if (cnt[ans[i]] > (m + 1) / 2) {
103 fri_num = ans[i];
104 }
105 }
106 if (fri_num != -1) {
107 for (i = 0; i < m; i++) {
108 if (ans[i] == fri_num && fri[i][1] != -1) {
109 ans[i] = fri[i][1];
110 cnt[fri_num]--;
111 cnt[fri[i][1]]++;
112 if (cnt[fri_num] <= (m + 1) / 2) {
113 break;
114 }
115 }
116 }
117 }
118 if (fri_num != -1 && cnt[fri_num] > (m + 1) / 2) {
119 printf("NO\n");
120 }
121 else {
122 printf("YES\n");
123 for (i = 0; i < m; i++) {
124 printf("%d ", ans[i]);
125 }
126 printf("\n");
127 }
128 }
129 //cout << "Hello World!\n";
130 #endif // (PRO == 'A')
131
132 #if (PRO == 'B')
133
134 //cout << "Hello World!\n";
135 #endif // (PRO == 'B')
136
137 #if (PRO == 'C')
138
139 //cout << "Hello World!\n";
140 #endif // (PRO == 'C')
141
142 #if (PRO == 'D')
143
144 //cout << "Hello World!\n";
145 #endif // (PRO == 'D')
146
147 #if (PRO == 'E')
148
149 //cout << "Hello World!\n";
150 #endif // (PRO == 'E')
151
152 #if (PRO == 'F')
153
154 //cout << "Hello World!\n";
155 #endif // (PRO == 'F')
156
157 #if (PRO == 'G')
158
159 //cout << "Hello World!\n";
160 #endif // (PRO == 'G')
161
162 #if (PRO == 'H')
163
164
165 #endif // (PRO == 'H')
166
167 #if (PRO == 'I')
168
169 //cout << "Hello World!\n";
170 #endif // (PRO == 'I')
171
172
173 //cout << "Hello World!\n";
174 return 0;
175 }
【评测结果】

ps. 几百年没有登过cf了。最近不太开心,恰巧清理邮箱时看到一大堆cf的邮件,就登上去看了看,密码竟然还记得(不像博客园,试了好几次之后只好找回密码,还被迫绑定了手机号)。随意点开了之前的一场div1的比赛,从踌躇满志到无奈苦笑,搞了好久才搞出来第一题,老年人的思维复建过程令人羞愧,心想还好没有鲁莽地注册比赛,否则本就不高的排名怕是要掉到姥姥家了。感觉这道题有些意思,所以来记录一下(虽然想来这样简单的题目的题解大概是不会有人看的吧)。讲不清自己是怎么一步一步选择了现在的生活状态,虽说谈不上不喜欢,但似乎确实没有过以前搞竞赛时A题的快乐了,取得的成绩从各种意义上也算不上好看,也许真的就是不适合吧。下次更新不知道又是什么时候了,希望下次能够开心一点。
[题解]Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) - A. Basic Diplomacy的更多相关文章
- Codeforces Round #543 (Div. 1, based on Technocup 2019 Final Round) 题解
题面戳这里 A. Diana and Liana 首先如果s>ks>ks>k一定无解,特判一下.那么我们考虑找恰好满足满足题目中的要求的区间[l,r][l,r][l,r],那么需要要 ...
- Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round)
A. Technogoblet of Fire 题意:n个人分别属于m个不同的学校 每个学校的最强者能够选中 黑客要使 k个他选中的可以稳被选 所以就为这k个人伪造学校 问最小需要伪造多少个 思路:记 ...
- Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)B. World Cup
The last stage of Football World Cup is played using the play-off system. There are n teams left in ...
- Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3) C. Peaceful Rooks (思维,dsu找环)
题意:一个棋盘上有一些"车",现在要让这些"车"跑到左倾斜的对角线上,每次可以移动一个棋子,但是棋盘的任意时刻都不能出现一个"车"能吃另一个 ...
- Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) D. XOR-gun (二进制,异或,前缀和)
题意:给你一组非递减的数,你可以对两个连续的数进行异或,使其合并为一个数,问最少操作多少次使得这组数不满足非递减. 题解:首先,给出的这组数是非递减的,我们考虑二进制,对于三个连续的非递减的最高位相同 ...
- Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) C. Bouncing Ball (后缀和,枚举)
题意:有一长度为\(n\)的平台,平台有的位置有木桩,可以使小球弹起来,小球必须从第\(p\)个位置开始,而且每次都会向右弹\(k\)个单位,然后有的位置是没有木桩的,你可以在这些的空的位置放一个木桩 ...
- Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) B. Repainting Street (枚举)
题意:有\(n\)栋房子,每栋房子都有自己的颜色\(c_i\),你每次可以对连续的长度为\(k\)的区间改变任何房子的颜色,问最少多少次可以使得所有房子颜色相同. 题解:因为只有\(100\)中颜色, ...
- Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) A. Prison Break
题意:有一张\(n\)x\(m\)的图,图中每个点都关押着罪犯,在坐标\((r,c)\)处有一个出口,每名罪犯每秒可以可以像上下最有移动一个单位或者不动,问所有罪犯能够逃离监狱的最少时间. 题解:直接 ...
- cf 20190307 Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round)
B. Mike and Children time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
随机推荐
- C#语言类型
讨论 所有类型在,值类型,引用类型用new创建,值类型由编译器自动补全 int等引用类型是轻量化结构更像是结构体 值类型在栈中,引用类型在堆中 所有类型由类派生,可以说每个是对象,也可以不是 由于.N ...
- IE8中li添加float属性,中英数字混合BUG
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- (3)ESP32 Python 制作一个办公室温度计
因为经常在办公室里面不知道实际室内温度是多少,所以用ESP32做了一个工具来进行温度&湿度的监测.在之前的文章当中,已经完成了ESP32的数据上云工作,如果要进行温度/湿度的检测.从原理上就是 ...
- POSIX之消息队列
my_semqueue_send.c: #include<stdio.h> #include<errno.h> #include<mqueue.h> #includ ...
- 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进
项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们使用一个数组保存预制的游戏,然后随机从中抽取一个游戏作为新游戏,如果 ...
- 微服务架构 | 5.1 使用 Netflix Hystrix 断路器
目录 前言 1. Hystrix 基础知识 1.1 Hystrix 断路器强调调用 1.2 两大类别的 Hystrix 实现 1.3 舱壁策略 1.4 Hystrix 在远程资源调用失败时的决策过程 ...
- 洛谷 P4708 画画(无标号欧拉子图计数)
首先还是类似于无标号无向图计数那样,考虑点的置换带动边的置换,一定构成单射,根据 Burnside 引理: \[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} ...
- AtCoder AGC003 简要题解
A 首先横向和纵向互相独立,因此只考虑横向的情况. 那么显然只要不只往一边走都一定存在一种构造方式,直接判断即可,复杂度 \(\mathcal{O}(|S|)\). B 首先相邻两个数同时配对两次可以 ...
- AtCoder AGC002 简要题解
从今天开始,联赛之前大约要完成前 \(20\) 套 \(\rm AGC\),希望不要鸽. A 略 B 感觉这题比 \(\rm C\) 题难. 考虑对于每个时刻维护每个位置是否可能出现红球,那么一个时刻 ...
- AT [ABC177F] I hate Shortest Path Problem
因为每行只有一个区域不能往下走,因此我们可以来分析一下从起点到整个矩形每个位置的最短路.可以发现每一行的最短路只与上一行的最短路有关,假设我们知道上一行的最短路,上一行不能往下走的区间在 \([L, ...