- Contest Info
- Solutions
- A. Auxiliary Project
- B. Boolean Satisfiability
- C. Consonant Fencity
- E. Equal Numbers
- G. Grand Test
- H. Hidden Supervisors
- I. Intelligence in Perpendicularia
- K. Kotlin Island
- L. Little Difference
Contest Info
传送门
Solved |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
9 / 12 |
O |
O |
O |
- |
O |
- |
Ø |
Ø |
O |
- |
O |
O |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Auxiliary Project
简单dp即可。
Code
/*
* Author: heyuhhh
* Created Time: 2020/6/11 13:13:46
*/
#include
#include
#include
#include
#include
#include
#include
#include
B. Boolean Satisfiability
开心签到。
Code
#include
#include
using namespace std;
#define TM "boolean"
char buf[1007];
int chs[57][2];
int main() {
#ifndef LOCAL
freopen(TM".in", "r", stdin);
freopen(TM".out", "w", stdout);
#endif
scanf("%s", buf);
int l=strlen(buf);
memset(chs,0,sizeof chs);
int qf=false;
for(int i=0; i
C. Consonant Fencity
因为不同字符数量很少,故直接状压枚举即可。
Code
/*
* Author: heyuhhh
* Created Time: 2020/6/11 14:53:04
*/
#include
#include
#include
#include
#include
#include
#include
#include
E. Equal Numbers
显然最后每个数只能都变为他们的\(lcm\)或者变到某一个数上面去。
那么对这两种情况都处理一下取最小值即可。
Code
/*
* Author: heyuhhh
* Created Time: 2020/6/11 15:57:13
*/
#include
#include
#include
#include
#include
#include
#include
#include
G. Grand Test
题意:
给定\(n\)点\(m\)条边的有向图,现在要找到起点\(S\)和终点\(T\),并且满足\(S\rightarrow T\)存在三条除开起点终点之外的点不重复的路径,并且要输出路径。
思路:
画图即可发现,若满足题中条件,一定具有“由两个环拼接起来”的特征,即两个环共享一部分,画个图就比较显然了。
那么找环的问题我们可以在\(dfs\)树或者\(bfs\)树上解决。
对于每条返祖边\((u,v)\),暴力给树上\(u\rightarrow v\)的路径染色。若某条边有两种颜色那么说明存在两个环重合,直接扣出来暴力\(dfs\)找路径即可。
细节见代码:
Code
/*
* Author: heyuhhh
* Created Time: 2020/6/12 15:31:13
*/
#include
#include
#include
#include
#include
#include
#include
#include
H. Hidden Supervisors
题意:
给定一个森林,现在每棵树两两相邻结点可以匹配,一个结点最多只能匹配一次。
现在将所有树拼接为一颗树,要求怎么拼接,最后的匹配对数最大。
思路:
- 对于一颗树,显然自底向上进行两两匹配最优。最后一颗树只会剩下0/1个根节点以及若干个叶子结点,接下来考虑不同树的"叶子-根"的匹配。
- 考虑拼接,直接将剩下\(1\)个根节点的树拼接到前面结点中即可,并且更新树的叶子结点;如果前面没有结点,则直接与树根相连,但此时不会产生新的匹配。
- 拼接时要按照叶子结点从大到小的顺序进行拼接,这样更新过后的结点数会更多,更有利于后续树根的匹配。
细节见代码:
Code
/*
* Author: heyuhhh
* Created Time: 2020/6/11 17:03:22
*/
#include
#include
#include
#include
#include
#include
#include
#include
I. Intelligence in Perpendicularia
答案即为总边长减去里面的边长。
Code
#include
#include
#include
using namespace std;
#define TM "intel"
int xs[1007], ys[1007];
int main() {
#ifndef LOCAL
freopen(TM".in", "r", stdin);
freopen(TM".out", "w", stdout);
#endif
int n; scanf("%d", &n);
for(int i=0; iy2) swap(y1,y2);
int v=y2-y1;
ans2+=v;
} else {
if(x1>x2) swap(x1,x2);
int v=x2-x1;
ans1+=v;
}
}
ans1 -= (Mx-mx)*2;
ans2 -= (My-my)*2;
printf("%lld\n", ans1+ans2);
return 0;
}
K. Kotlin Island
签到。
Code
/*
* Author: heyuhhh
* Created Time: 2020/6/11 13:24:07
*/
#include
#include
#include
#include
#include
#include
#include
#include
L. Little Difference
题意:
给定一个数\(n,n\leq 10^{18}\),将其分为若干个相差至多为\(1\)的数的乘积,如果有无限个则输出\(-1\)。
思路:
显然最后的分解式中有\(1\)则有无限多个分解方案,此时只可能出现在\(n=1,n=2\)的情况中。
分解式中有\(1,2\)个数的情况我们可以直接考虑,接下来就处理分解式中有大于\(2\)个数的情况,此时每个数最多为\(10^6\)。那么我们可以直接枚举分解式中较小的那个数即可。
详见代码:
Code
/*
* Author: heyuhhh
* Created Time: 2020/6/11 14:13:21
*/
#include
#include
#include
#include
#include
#include
#include
#include