Atcoder Beginner Contest 367 C-F
Atcoder Beginner Contest 367 C-F
C - Enumerate Sequences
题意
按字典序升序输出所有满足下列条件的序列数量。
-
长度为
。 -
第
个元素介于 与 之间。 -
所有元素之和是
的倍数。
思路
搜索即可。搜索时记录当前选了哪些数和元素之和,最后搜完了判断一下即可。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n, k, a[N], R[N];
void dfs(int x, int sum) {
if (x == n + 1) {
if (sum % k) return ;
for (int i = 1; i <= n; i ++) {
cout << a[i] << " ";
}
cout << "\n";
return ;
}
for (int i = 1; i <= R[x]; i ++) {
a[x] = i;
dfs(x + 1, sum + i);
}
}
void solve() {
cin >> n >> k;
for (int i = 1; i <= n; i ++) cin >> R[i];
dfs(1, 0);
cout << "\n";
}
int main() {
int T = 1;
// cin >> T;
while (T --) solve();
return 0;
}
D - Pedometer
题意
一个湖周围有
从休息区
从休息区
求
思路
容易想到把原序列复制一遍破环成链。
把原
若
原问题转化为了有多少对
转化一下即
使用一个桶维护
倒序枚举
预处理时把
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
int n, m, a[N], c[N];
ll ans;
void solve() {
cin >> n >> m;
for (int i = 1; i <= n; i ++)
cin >> a[i + 1], a[i + n + 1] = a[i + 1],
a[i + 1] %= m, a[i + n + 1] %= m;
for (int i = 1; i <= 2 * n; i ++) a[i] += a[i - 1], a[i] %= m;
for (int i = n + 1; i <= 2 * n; i ++) c[a[i]] ++;
for (int i = n; i >= 1; i --) {
c[a[i + n]] --;
ans += c[a[i]];
c[a[i]] ++;
}
cout << ans << "\n";
}
signed main() {
int T = 1;
// cin >> T;
while (T --) solve();
return 0;
}
E - Permute K times
题意
给你一个长度为
以及一个长度为
输出在
用
思路
因为
计算答案时对于每个
计算时若
即将
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int n, k, a[N], f[N][70], b[N];
void solve() {
cin >> n >> k;
for (int i = 1; i <= n; i ++) cin >> f[i][0];
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= 59; i ++)
for (int j = 1; j <= n; j ++)
f[j][i] = f[f[j][i - 1]][i - 1];
for (int i = 1; i <= n; i ++) {
int now = i;
for (int j = 0; j <= 59; j ++)
if (k >> j & 1) now = f[now][j];
cout << a[now] << " ";
}
}
signed main() {
int T = 1;
// cin >> T;
while (T --) solve();
return 0;
}
F - Rearrange Query
题意
给你长度为
您需要依次处理
给定正整数
思路
若
如何比较数的出现次数呢?我们想到了哈希,把每个数的出现次数哈希起来。
相当于把数的出现次数转化成一个
进制可以乱设,但尽量大于
可以使用双哈希以提高正确率。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
const int N = 2e5 + 5;
int n, q, a[N], b[N];
ull ha[N], hb[N], pw[N];
ull getHA(int l, int r) {
return ha[r] - ha[l - 1];
}
ull getHB(int l, int r) {
return hb[r] - hb[l - 1];
}
ui ha2[N], hb2[N], pw2[N];
ui getHA2(int l, int r) {
return ha2[r] - ha2[l - 1];
}
ui getHB2(int l, int r) {
return hb2[r] - hb2[l - 1];
}
void solve() {
cin >> n >> q;
pw[0] = 1, pw2[0] = 1;
for (int i = 1; i <= n; i ++) pw[i] = pw[i - 1] * 19260817;
for (int i = 1; i <= n; i ++) pw2[i] = pw2[i - 1] * 998244353;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) cin >> b[i];
for (int i = 1; i <= n; i ++)
ha[i] = ha[i - 1] + pw[a[i]],
ha2[i] = ha2[i - 1] + pw2[a[i]];
for (int i = 1; i <= n; i ++)
hb[i] = hb[i - 1] + pw[b[i]],
hb2[i] = hb2[i - 1] + pw2[b[i]];
while (q --) {
int l, r, L, R;
cin >> l >> r >> L >> R;
ull HA, HB;
HA = getHA(l, r);
HB = getHB(L, R);
ui HA2, HB2;
HA2 = getHA2(l, r);
HB2 = getHB2(L, R);
if (HA == HB && HA2 == HB2) cout << "Yes\n";
else cout << "No\n";
}
}
int main() {
int T = 1;
// cin >> T;
while (T --) solve();
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18365133,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】