前言

很难受,自己缺少太多基础只是了,很多看起来可做的都写不了,自己实在是太菜了。

希望沈阳可以混一个 cu\color{gold}\text{cu} 吧。

另外这个题就太体现 ACM 思维的活跃性以及严谨性了,我还太菜,希望明年能拿个 Au\text{Au}

F. Fields Division

题目大意,一个图,每个点点权 2i2^i 询问将图分成两个连通块后,两边权值和相差最小的方案。

显然 2n2^n 这个点太大了,我们考虑把它单独分开,剩下 n1n-1 个点找跑一个并查集, n1n-1 号点所在的连通块和其他即为所求。

I. Invested Money

题目大意,你借了钱后,每三十天还一次钱,如果那天是周末,就咕到周一

现在告诉你你多久借了钱,询问最近多少天后要还钱。

首先打表,发现 9191 是一个循环节,那么我们直接就暴力好了(噩梦的开始)

但是你会发现大 WA 特 WA

因为前面那些数字不在循环里面,你仅仅是把后面的放进循环节了,所以我们保留前9191和一个循环节才可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <bits/stdc++.h>
using namespace std;

int n, a[100010], d, ans;

int vis[210], aans[210];
string st;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin>>st;
cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i];
if(a[i]>91) a[i]=a[i]%91+91;
vis[a[i]] = 1;
}
ans = 0x3f3f3f3f;
if(st=="Mon") d=1;
if(st=="Tue") d=2;
if(st=="Wed") d=3;
if(st=="Thu") d=4;
if(st=="Fri") d=5;
if(st=="Sat") d=6;
if(st=="Sun") d=7;
for(int i = 181; i >= 0; -- i) {
int t = -i;
int j = d;
for(int k = 1; k <= i; ++ k) {
j --;
if(j == 0) j=7;
}
while((t < 0 && i != 0) || (t <= 0 && i == 0)) {
t += 30;
j += 2;
if(j >= 8) j -= 7;
if(j == 6) j = 1, t += 2;
if(j == 7) j = 1, t ++;
}
aans[i]=t;

}
for(int i=0;i<=181;i++) if(vis[i]) ans=min(ans,aans[i]);
cout<<ans<<"\n";
return 0;
}

H. Hamilton - The Musicalv

这道题图建错了,我先说错误的方式,好让大伙嘲笑。

我们保证让偶数比奇数多 11 ,换句话说我们让偶数把奇数包围(加上一个00n+1n+1 或者就是 nn ),然后让原点连过来一条流量为 22 的边,然后向 0,n0,n 或者 n+1n+1 连一个流量为 11 的边,让后让每个奇数和偶数连一个流量为 11 费用为 Gi,jG_{i,j} 的边,最后让奇数点和汇点相连。

很正确是不是,但是我们考虑有这种情况,2,42,4 两个点都连到了 3,53,5 ,这在题目条件下是不允许的,但是我们能跑出来。

所以为了避免这种情况,我们把 2,42,4 合点,这样再连 jj 就代表子序列是 2,j,42,j,4 ,这样两个数对应了只能对应一个数字,而且必然的不会出现上面那样的情况。

只能说自己很菜,这都不知道,希望神仙 October\text{\color{black}O\color{red}ctober} 带飞