AtCoder Beginner Contest 092

C

因为是按顺序走的,所以假如第 i个点不用走,我们只需要减去第 i−1个点到第 i个点的距离,以及第 i个点到第 i+1个点的距离,最后再加上第 i−1个点到第 i+1 个点的距离即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// LUOGU_RID: 174605005
#include <bits/stdc++.h>
using namespace std;
int a[100001], n, ans;
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i];
int b = 0;
for (int i = 1; i <= n + 1; ++i)
b += abs(a[i] - a[i - 1]);
for (int i = 1; i <= n; ++i)
{
ans = b - abs(a[i] - a[i - 1]) - abs(a[i + 1] - a[i]) + abs(a[i + 1] - a[i - 1]);
cout << ans << endl;
}
cout << endl;
}

D

构造一个100*100的矩阵。

上半部分黑色,下半部分白色, 选择上半部分的B-1个不相邻的涂黑,下半部分类似。

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
#include <bits/stdc++.h>
#define int long long
const int N = 155;
using namespace std;

char col[N][N];
const int A = 50, B = 100;

void solve()
{
int a, b;
cin >> a >> b;
a--, b--;
cout << B << ' ' << B << endl;
for (int i = 1; i <= A; i++)
for (int j = 1; j <= B; j++)
{
col[i][j] = '.';
col[i + A][j] = '#';
}
for (int i = 2; b; i += 2)
for (int j = 2; b && j <= B; j += 2)
col[i][j] = '#', b--;
for (int i = 52; a; i += 2)
for (int j = 2; a && j <= B; j += 2)
col[i][j] = '.', a--;
for (int i = 1; i <= B; i++)
{
for (int j = 1; j <= B; j++)
cout << col[i][j];
cout << endl;
}
}

main()
{
ios::sync_with_stdio(0);
int _T = 1; // cin>>_T;
while (_T--)
solve();
}