[题解]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 ...
随机推荐
- 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse
<设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...
- HTML+CSS+Javascript实现轮播图效果
HTML+CSS+Javascript实现轮播图效果 注意:根据自己图片大小来更改轮播图大小. <!doctype html> <html> <head> < ...
- Python向mysql数据库插入数据
一.向表tcolor中插入数据的主要流程如下: import datetimeimport pymysql.cursorsconnection = pymysql.connect(host='loca ...
- 【刷题-LeetCode】150 Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...
- 浅析Java中的线程池
Java中的线程池 几乎所有需要异步或并发执行任务的程序都可以使用线程池,开发过程中合理使用线程池能够带来以下三个好处: 降低资源消耗 提高响应速度 提高线程的可管理性 1. 线程池的实现原理 当我们 ...
- Airtest 的连接安卓模拟器
1. 开启安卓模拟器 2. 查看进程,MEmuHeadless.exe的进行程号, 然后在cmd中输入 netstat -ano|findstr "16116" 3. 到 airt ...
- 布客·ApacheCN 编程/大数据/数据科学/人工智能学习资源 2020.4
公告 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复"教程/路线/比赛/报告/技术书/课程/轻小说/漫 ...
- 「JOI 2014 Final」飞天鼠
「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...
- SqlServer基础语法
历史 有很多软件公司开发了数据库产品,其中微软公司的数据库产品命名为 SQL Server,也称 MS SQL Server. 1989年 Ashton-Tate/Microsoft SQL Serv ...
- iconv(gb2312<->utf-8)
转载请注明来源:https://www.cnblogs.com/hookjc/ unix下安装PHP的module,需要重新编译PHP,Windows下安装模板,只需将php.ini里的配置打开相应的 ...