代码源挑战赛 Round 4
#19. [R4A]数位交换
#include <bits/stdc++.h>
using i64 = long long;
using i32 = int32_t;
using vi = std::vector<i64>;
using std::cin, std::cout;
#define int i64
const int mod = 998244353;
i32 main() {
std::ios::sync_with_stdio(false), cin.tie(nullptr);
int x;
cin >> x;
cout << (x%10) * 100 + (x / 10 % 10 ) * 10 + (x / 100);
return 0;
}
#20. [R4B]保留DMY
#include <bits/stdc++.h>
using i64 = long long;
using i32 = int32_t;
using vi = std::vector<i64>;
using std::cin, std::cout;
#define int i64
const int mod = 998244353;
i32 main() {
std::ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
cin >> n;
std::string s, t = "-1";
cin >> s;
for(auto c : s)
if(c == 'D' or c == 'M' or c == 'Y') cout << c, t = "";
cout << t;
return 0;
}
#21. [R4C]因式分解
直接对每一个数单独进行因式分解即可。
#include <bits/stdc++.h>
using i64 = long long;
using i32 = int32_t;
using vi = std::vector<i64>;
using std::cin, std::cout;
#define int i64
const int mod = 998244353;
i32 main() {
std::ios::sync_with_stdio(false), cin.tie(nullptr);
std::map<int, int> cnt;
int n;
cin >> n;
for (int i = 0, x; i < n; i++) {
cin >> x;
for (int y = 2; y * y <= x; y++) {
while (x % y == 0) cnt[y]++, x /= y;
}
if(x != 1)cnt[x] ++;
}
for(auto [k, v] : cnt) cout << k << " " << v << " ";
return 0;
}
# #22. [R4D]排队问题
有一个比较明显的规律是,无论何种情况都要让耗时短的同学在队列中尽可能的靠前。
所以可以把所有的所有的同学按照时间排序。然后便可以求出所用同学等待时间之和。
对于每一位同学,考虑对答案的贡献是他等待的时间,和他后面的同学每人等待了一个\(a[i]\)的时间。
#include <bits/stdc++.h>
using i64 = long long;
using i32 = int32_t;
using i128 = __int128;
using std::cin, std::cout;
using std::istream, std::ostream;
using std::string;
#define int i64
using vi = std::vector<int>;
using pii = std::pair<int,int>;
i32 main() {
std::ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
cin >> n;
std::vector<pii>a(n + 1);
for(int i = 1; i <= n ; i ++)
cin >> a[i].first, a[i].second = i;
std::sort(a.begin() + 1, a.end());
vi wait(n + 1);
for (int i = 1; i <= n; i++)
wait[i] = wait[i - 1] + a[i - 1].first;
int sum = std::accumulate(wait.begin(), wait.end(), 0LL);
vi res(n + 1);
for(int i = 1; i <= n; i ++)
res[a[i].second] = sum - wait[i] - (i128)a[i].first * (n - i);
for(int i = 1; i <= n; i ++)
cout << res[i] << "\n";
return 0;
}
#23. [R4E]区间异或和
每一个二进制位之间是相互独立的,所以可以按照二进位来单独操作。
对于区间异或和问题,可以用前缀异或和,转换为两个点异或值。
这样的话,对于一个数,只要能统计一出之前的0和1的个数就能算出贡献。
#include <bits/stdc++.h>
using i64 = long long;
using i32 = int32_t;
using i128 = __int128;
using std::cin, std::cout;
using std::istream, std::ostream;
using std::string;
#define int i64
using vi = std::vector<int>;
using pii = std::pair<int,int>;
const int N = 1e9;
i32 main() {
std::ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
cin >> n;
vi a(n + 1);
for(int i = 1; i <= n ; i ++) cin >> a[i];
int res = 0;
for(int p = 1; p <= N; p <<= 1) {
for(int i = 1, pre = 0, s = 0; i <= n; i ++) {
s ^= a[i];
if(s & p) {
res += (i - pre) * p;
pre ++;
} else{
res += pre * p;
}
}
}
cout << res << "\n";
return 0;
}

浙公网安备 33010602011771号