Codeforces Round #624 (Div. 3)

挺简单的

题目链接:https://codeforces.com/contest/1311


A:

白给

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define pb emplace_back
 6 #define mp make_pair
 7 #define eps 1e-8
 8 #define lson (curpos<<1)
 9 #define rson (curpos<<1|1)
10 /* namespace */
11 using namespace std;
12 /* header end */
13 
14 int t;
15 
16 int main() {
17     scanf("%d", &t);
18     while (t--) {
19         int a, b, cnt = 0;
20         scanf("%d%d", &a, &b);
21         if (a == b) puts("0");
22         else if (a < b) {
23             if ((b - a) & 1) puts("1");
24             else puts("2");
25         } else {
26             if ((b - a) & 1) puts("2");
27             else puts("1");
28         }
29     }
30     return 0;
31 }
View Code

B:

扫n次p数组,每次都检查a[p[i]]与a[p[i]+1]是否可交换,再检查a数组即可

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define pb emplace_back
 6 #define mp make_pair
 7 #define eps 1e-8
 8 #define lson (curpos<<1)
 9 #define rson (curpos<<1|1)
10 /* namespace */
11 using namespace std;
12 /* header end */
13 
14 int t;
15 const int maxn = 110;
16 int n, m, a[maxn], p[maxn];
17 
18 int main() {
19     scanf("%d", &t);
20     while (t--) {
21         scanf("%d%d", &n, &m);
22         for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
23         for (int i = 1; i <= m; i++) scanf("%d", &p[i]);
24         for (int cnt = 1; cnt <= n; cnt++) {
25             for (int i = 1; i <= m; i++) {
26                 if (a[p[i]] > a[p[i] + 1]) swap(a[p[i]], a[p[i] + 1]);
27             }
28         }
29         int flag = 1;
30         for (int i = 1; i < n; i++) {
31             if (a[i] > a[i + 1]) {
32                 flag = 0;
33                 break;
34             }
35         }
36         if (flag) puts("YES"); else puts("NO");
37     }
38     return 0;
39 }
View Code

C:

前缀和预处理一下就行

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define pb emplace_back
 6 #define mp make_pair
 7 #define eps 1e-8
 8 #define lson (curpos<<1)
 9 #define rson (curpos<<1|1)
10 /* namespace */
11 using namespace std;
12 /* header end */
13 
14 const int maxn = 2e5 + 10;
15 int t, n, m, p[maxn], cnt[maxn][26], ans[26];
16 char s[maxn];
17 
18 int main() {
19     scanf("%d", &t);
20     while (t--) {
21         scanf("%d%d", &n, &m);
22         scanf("%s", s + 1);
23         for (int i = 0; i <= n; i++)
24             for (int j = 0; j < 26; j++)
25                 cnt[i][j] = 0;
26         for (int i = 0; i < 26; i++) ans[i] = 0;
27         for (int i = 1; i <= m; i++) scanf("%d", &p[i]);
28 
29         for (int i = 1; i <= n; i++) {
30             cnt[i][s[i] - 'a']++;
31         }
32         for (int i = 1; i <= n; i++) {
33             for (int j = 0; j < 26; j++) {
34                 cnt[i][j] += cnt[i - 1][j];
35             }
36         }
37         for (int i = 1; i <= m; i++) {
38             for (int j = 0; j < 26; j++) {
39                 ans[j] += cnt[p[i]][j];
40             }
41         }
42         for (int i = 0; i < 26; i++) ans[i] += cnt[n][i];
43         for (int i = 0; i < 26; i++) printf("%d ", ans[i]);
44         puts("");
45     }
46     return 0;
47 }
View Code

D:

比较坑的题,队友还FST了。

题意是给定三个正整数,满足a<=b<=c,可以使三个数变大或变小(不能小于1),问三个数如何变化,能满足a|b且b|c的同时总变化量最小。

由于三个数都不到1e4,所以直接想法是枚举,但枚举的范围很坑。令第一个数的变化范围为[1,c],第二个数为第一个数的i倍且i*a<=2*b(两倍即可,一倍必错),第三个数为第二个数的j倍且j*b<=2*c。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define pb emplace_back
 6 #define mp make_pair
 7 #define eps 1e-8
 8 #define lson (curpos<<1)
 9 #define rson (curpos<<1|1)
10 /* namespace */
11 using namespace std;
12 /* header end */
13 
14 int t, a, b, c;
15 
16 int main() {
17     scanf("%d", &t);
18     while (t--) {
19         int aa, bb, cc, ans = INT_MAX;
20         scanf("%d%d%d", &a, &b, &c);
21         for (int i = 1; i <= c; i++) {
22             int curA = i, curB = 0, curC = 0;
23             for (int j = 1; j * i <= 2 * b; j++) {
24                 curB = j * i;
25                 for (int k = 1; k * curB <= 2 * c; k++) {
26                     curC = k * curB;
27                     int tmp = abs(a - curA) + abs(b - curB) + abs(c - curC);
28                     if (tmp < ans) {
29                         ans = tmp;
30                         aa = curA, bb = curB, cc = curC;
31                     }
32                 }
33             }
34         }
35         printf("%d
%d %d %d
", ans, aa, bb, cc);
36     }
37     return 0;
38 }
View Code

E:

什么东西,完全没看

F:

题意:一维坐标系上给定n个整点,保证无重复点,每个整点有一个向左或向右的速度且保持不变。定义d(i,j)为点对i,j的最近可能距离(例如若两个点会相遇,则d(i,j)=0),求所有点与其他点最近可能距离之和。

很显然,对于点对x和y,只有当x的位置在y左边(x<y)且x速度大于y时,这两个点才会相遇。否则它们不仅不会相遇,距离还会逐渐变大。我们要做的是找出所有无法相遇的点,并把它们的初始距离都加起来。

我们考虑点的初始位置。把所有点先按位置再按速度排序。遍历所有点,对于第i个点,要找出所有点j满足Xj<Xi且Vj<=Vi,以及所有Xj的和。显然这里对速度进行离散化即可。设满足条件的点的数量为cnt,满足条件的点的位置总和为sum,显然对于当前点,ans+=Xi*cnt-sum,并且把个数cnt所对应的出现次数和横坐标总和都记录下来即可。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define pb emplace_back
 6 #define mp make_pair
 7 #define eps 1e-8
 8 #define lson (curpos<<1)
 9 #define rson (curpos<<1|1)
10 /* namespace */
11 using namespace std;
12 /* header end */
13 
14 struct FenwickTree {
15     int n;
16     vector<ll>num;
17     FenwickTree(): n(0) {}
18     FenwickTree(int _n) {
19         n = _n;
20         num.assign(n, 0);
21     }
22     void add(int i, int val) {
23         for (; i < n; i |= i + 1) num[i] += val;
24     }
25     ll sum(int i) {
26         ll ret = 0;
27         for (; i >= 0; i = (i & (i + 1)) - 1) ret += num[i];
28         return ret;
29     }
30 };
31 
32 int main() {
33     int n; scanf("%d", &n);
34     vector<pair<int, int>>point(n);
35     vector<int>speed;
36     for (int i = 0; i < n; i++) scanf("%d", &point[i].first);
37     for (int i = 0; i < n; i++) {
38         scanf("%d", &point[i].second);
39         speed.push_back(point[i].second);
40     }
41 
42     sort(speed.begin(), speed.end());
43     speed.erase(unique(speed.begin(), speed.end()), speed.end());
44     sort(point.begin(), point.end());
45 
46     ll ans = 0;
47     FenwickTree cnt(n), sumx(n);
48     for (auto i : point) {
49         i.second = lower_bound(speed.begin(), speed.end(), i.second) - speed.begin();
50         ans += cnt.sum(i.second) * i.first - sumx.sum(i.second);
51         cnt.add(i.second, 1);
52         sumx.add(i.second, i.first);
53     }
54     printf("%lld
", ans);
55     return 0;
56 }
View Code
原文地址:https://www.cnblogs.com/JHSeng/p/12363216.html