Codeforces Round 923 (Div. 3) A-G
A
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd; // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine
void solve()
{
int n;
cin >> n;
vector<char> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
int l = 1, r = n;
for (int i = 1; i <= n; i++)
if (a[i] == 'B')
{
l = i;
break;
}
for (int i = n; i >= 1; i--)
if (a[i] == 'B')
{
r = i;
break;
}
cout << r - l + 1 << endl;
}
int main()
{
// cout << setprecision(5);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}
B
用vector维护每个字母当前已经出现了多少次
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd; // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine
void solve()
{
int n;
cin >> n;
vector<int> a(n + 1);
vector<vector<int>> e(n + 1);
for (int i = 0; i < 26; i++)
e[0].push_back(i);
vector<int> ans(n + 1, 0);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
auto t = e[a[i]].back();
e[a[i]].pop_back();
ans[i] = t;
e[a[i] + 1].push_back(t);
}
for (int i = 1; i <= n; i++)
cout << char('a' + ans[i]);
cout << endl;
}
int main()
{
// cout << setprecision(5);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}
C
先考虑只能在a/b中选的,如果大于\(\frac{k}{2}\),则不行
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd; // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine
void solve()
{
int n, m, k;
cin >> n >> m >> k;
map<int, int> mpa, mpb;
vector<int> a(n + 1), b(m + 1);
for (int i = 1; i <= n; i++)
cin >> a[i], mpa[a[i]] = 1;
for (int i = 1; i <= m; i++)
cin >> b[i], mpb[b[i]] = 1;
// sort(a.begin() + 1, a.end());
// sort(b.begin() + 1, b.end());
// vector<int> both;
int cnta = k / 2, cntb = k / 2;
// cout << cnta << " " << cntb << endl;
for (int i = 1; i <= k; i++)
if (mpa[i] || mpb[i])
{
if (mpa[i] && mpb[i])
{
}
else
{
if (mpa[i])
cnta--;
else
cntb--;
}
}
else
{
cout << "NO" << endl;
return;
}
// cout << cnta << " " << cntb << endl;
if (cnta >= 0 && cntb >= 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
int main()
{
// cout << setprecision(5);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}
D
如果\(a[i]\ne a[i-1]\),那么就让前缀和\(s[i]\)+1,对于每个询问\(l,r\),先看\(s[l]\)是否等于\(s[r]\),如果不等,说明存在,再二分找到答案即可。
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd; // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine
void solve()
{
int n, q;
cin >> n;
vector<int> a(n + 1), s(n + 1, 0);
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 2; i <= n; i++)
{
s[i] = s[i - 1];
if (a[i] != a[i - 1])
s[i]++;
}
cin >> q;
for (int i = 1; i <= q; i++)
{
int x, y;
cin >> x >> y;
int l = x + 1, r = y;
while (l < r)
{
int mid = l + r >> 1;
if (s[mid] != s[x])
r = mid;
else
l = mid + 1;
}
if (s[l] != s[x])
cout << x << " " << l << endl;
else
cout << "-1 -1" << endl;
}
}
int main()
{
// cout << setprecision(5);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}
E
题目要求\(max(s)-min(s)\le 1\),那么可以想到类似滑动窗口的东西,左边弹出x后,右边加入一个x+1/x-1,来满足条件。
然后就可以采用这种类似的方法,枚举前k个位置,每隔k,+1/-1。
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd; // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine
void solve()
{
int n, k;
cin >> n >> k;
vector<int> a(n + 1);
int mi = 1, mx = n;
for (int i = 1; i <= k; i++)
{
if (i & 1)
{
for (int j = i; j <= n; j += k)
a[j] = mx--;
}
else
{
for (int j = i; j <= n; j += k)
a[j] = mi++;
}
}
for (int i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
// cout << setprecision(5);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}
F
先用最大生成树找到最小的可以形成环的边,然后用除这条边以外的其他边建图,dfs出环上的其他点。
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd; // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine
void solve()
{
int n, k;
cin >> n >> k;
vector<int> a(n + 1);
int mi = 1, mx = n;
for (int i = 1; i <= k; i++)
{
if (i & 1)
{
for (int j = i; j <= n; j += k)
a[j] = mx--;
}
else
{
// int num = 0;
// for (int j = i; j <= n; j += k)
// num++;
// st += num;
// cout << "st?" << st << endl;
// int mx = st;
for (int j = i; j <= n; j += k)
a[j] = mi++;
}
}
for (int i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
// cout << setprecision(5);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}
G