2025.2.14——1400
------------------------------------------------
-
思维+排序/双指针/二分/队列匹配+思维+二分/位运算+思维+数学+思维
A
- 一眼想到的是维护信息计数。
- 维护两个信息同时用长的一半去找短的一半。
- 较好的思维题。
B
- 贪心匹配:优先使用最小的匹配合法最小的。
- 排序+双指针/二分/队列匹配。
C
- 出现一次,子数组也是子序列,所以不能再出现了。
- 发现边界是控制出现与否的充要条件。
D
- 从每一位考虑,最初以为
k
k
k 每一位都需要出现,其实不是,但可以凭借这个思路计算出区间按位与具体数的。
- 另解:今天才知道
s
t
st
st 表可以维护区间按位与、按位或值。
E
- 逆向思维+优化模拟:指针移动+找循环。
- 思维量挺多。
F
- 数学题。证明无解不太懂,限制次数过了。 洛谷题解。
G
- LCM与GCD问题,数学一下分析因子。
H
- 横向纵向分别考虑。横向可转化为纵向。
- 考虑纵向:交替发现对纵向平衡性无影响。同时对两行平衡性无影响且无后效性。
------------------------代码------------------------
A
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
// cin >> T;
while (T--)
_();
return 0;
}
int has[6][46];
auto sum(string s, int l, int r)
{
int ans = 0;
for (int i = l; i <= r; i++)
ans += s[i] - '0';
return ans;
}
auto sum(string s)
{
int ans = 0;
for (auto v : s)
ans += v - '0';
return ans;
}
auto tar_sum(string s, int l, int r)
{
return 2 * sum(s, l, r) - sum(s);
}
void _()
{
int n;
cin >> n;
vector<string> s(n);
for (auto &v : s)
{
cin >> v;
has[v.size()][sum(v)]++;
}
int res = 0;
for (auto l : s)
{
int ln = l.size();
for (int i = 2; i <= 10; i += 2)
{
int rn = i - ln;
if (rn <= 0 || rn > ln)
continue;
int tar_r = tar_sum(l, 0, i / 2 - 1);
if (tar_r < 0)
continue;
res += has[rn][tar_r];
}
}
for (auto r : s)
{
int rn = r.size();
for (int i = 2; i <= 10; i += 2)
{
int ln = i - rn;
if (ln <= 0 || ln >= rn)
continue;
int tar_l = tar_sum(r, rn - i / 2, rn - 1);
if (tar_l < 0)
continue;
res += has[ln][tar_l];
}
}
cout << res;
}
// int has[6][46][6][46];
// void _()
// {
// memset(has, 0x3f, sizeof has);
// int n;
// cin >> n;
// // struct Node
// // {
// // /* data */
// // int len, sum, prelen, presum;
// // };
// // map<Node, int> has;
// auto get_suf = [&](string s, int suf)
// {
// int sum = 0, m = s.size();
// for (int i = m - 1; i >= m - suf; i--)
// sum += s[i] - '0';
// return sum;
// };
// auto get_pre = [&](string s, int pre)
// {
// int sum = 0, m = s.size();
// for (int i = 0; i < pre; i++)
// sum += s[i] - '0';
// return sum;
// };
// int res = 0;
// for (int i = 0; i < n; i++)
// {
// string s;
// cin >> s;
// res++;
// int m = s.size();
// for (int sum = 0; sum <= 90; sum += 2)
// for (int len = 2; len <= 10; len += 2)
// {
// int tar_sum = sum - get_pre(s, m);
// int tar_len = len - m;
// // bug3(len, m, tar_len);
// if (tar_sum < 0 || tar_len < 0 || tar_len > 5 || tar_sum > 45)
// continue;
// int half = len >> 1;
// if (m >= tar_len)
// {
// if (get_suf(s, half) << 1 == len)
// {
// for (int i = 1; i <= 5; i++)
// for (int j = 0; j <= 45; j++)
// res += has[tar_len][tar_sum][i][j];
// }
// }
// else
// {
// // bug2(tar_len, tar_sum);
// // bug2(half, tar_sum >> 1);
// res += has[tar_len][tar_sum][half][tar_sum >> 1];
// }
// }
// int sum = get_pre(s, m);
// for (int i = 0; i < m; i++)
// has[m][sum][i + 1][get_pre(s, i + 1)]++, bug(has[m + 1][sum][i][get_pre(s, i + 1)]);
// }
// cout << res;
// el;
// }
B
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
vector<pair<int, int>> a;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
a.push_back({x, -1});
}
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
a.push_back({x, 1});
}
sort(begin(a), end(a));
int res = n;
queue<int> q;
for (auto [x, y] : a)
{
if (y == -1)
q.push(x);
else
{
if (q.size() && x > q.front())
res--, q.pop();
}
}
cout << res << '\n';
}
// void _()
// {
// int n;
// cin >> n;
// vector<int> a(n), b(n);
// for (int &x : a)
// cin >> x;
// for (int &x : b)
// cin >> x;
// sort(begin(a), end(a));
// sort(begin(b), end(b));
// int l = 0, r = 0, res = n;
// for (; r < n; r++)
// if (a[l] < b[r])
// l++, res--;
// cout << res;
// el;
// }
C
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
vector<int> a(n + 1), f(n + 1), g(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
map<int, bool> has;
for (int i = 1; i <= n; i++)
if (!has[a[i]])
f[i] = 1, has[a[i]] = 1;
has.clear();
for (int i = n; i; i--)
if (!has[a[i]])
g[i] = 1, has[a[i]] = 1;
int pre = 0, res = 0;
for (int i = 1; i <= n; i++)
{
pre += f[i];
res += pre * g[i];
}
cout << res;
el;
}
D
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
vector<vector<int>> pre(30, vector<int>(n + 1));
for (int i = 0; i < 30; i++)
for (int j = 1; j <= n; j++)
pre[i][j] = pre[i][j - 1] + (a[j] >> i & 1);
// ST表 RMQ 倍增
// dp[i][j] 以i为起点 长度为1<<j的区间的最大值
vector<vector<int>> dp(n + 1, vector<int>(32));
// init
for (int j = 0; j < 30; j++) // j 是每一层状态
for (int i = 1; i <= n; i++)
{
if (i + (1 << j) - 1 > n)
continue;
if (!j)
dp[i][j] = a[i];
else
dp[i][j] = dp[i][j - 1] & dp[i + (1 << j - 1)][j - 1];
}
// query
auto ask = [&](int l, int r)
{
int k = __lg(r - l + 1);
return dp[l][k] & dp[r + 1 - (1 << k)][k];
};
auto ok = [&](int l, int r, int k)
{
// int ans = 0;
// for (int i = 0; i < 30; i++)
// {
// if (pre[i][r] - pre[i][l - 1] == (r - l + 1))
// ans += 1ll << i;
// }
// return ans >= k;
return ask(l, r) >= k; // ST表只需这一句
};
// bug(ok(1, 1, 7));
// bug(ok(1, 2, 7));
int q;
cin >> q;
while (q--)
{
int L, k;
cin >> L >> k;
int l = L - 1, r = n + 1;
while (r - l - 1)
{
int R = l + r >> 1;
if (ok(L, R, k))
l = R;
else
r = R;
}
// bug2(l, r);
cout << (l < L ? -1 : l) << ' ';
}
el;
}
E
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, k;
cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
int f = n;
vector<int> vis(n + 1);
while (k--)
{
if (a[f] > n)
{
cout << "No";
el;
return;
}
vis[f] = 1;
f = (f - a[f] + n) % n;
if (vis[f])
break;
}
// k %= cnt;
// while (k--)
// f = a[f];
// for (int i = f + 1; i <= n; i++)
// cout << a[i] << ' ';
// for (int i = 1; i <= f; i++)
// cout << a[i] << ' ';
cout << "Yes";
el;
}
F
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, m;
cin >> n >> m;
n % m;
int cnt = 100, res = 0;
while (cnt--)
{
if (n % m == 0)
{
cout << res;
el;
return;
}
while (n < m)
{
res += n;
n <<= 1;
}
n %= m;
}
cout << -1;
el;
}
G
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
// cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, m;
cin >> n;
vector<int> t(n);
map<int, int> a, b;
for (int &x : t)
cin >> x;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
a[t[i]] = x;
}
cin >> m;
t.assign(m, 0);
for (int &x : t)
cin >> x;
for (int i = 0; i < m; i++)
{
int x;
cin >> x;
b[t[i]] = x;
}
constexpr int mod = 998244353;
int res = 1;
for (auto [x, y] : b)
if (a[x] < y)
res = 0;
for (auto [x, y] : a)
res *= y > b[x] ? 2 : 1, res %= mod;
cout << res;
el;
}
H
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, m;
cin >> n >> m;
vector<string> s(n + 1);
for (int i = 1; i <= n; i++)
cin >> s[i], s[i] = ' ' + s[i];
vector<vector<int>> f(n + 1, vector<int>(m + 1));
bool fail = 0;
for (int i = 1; i <= n; i++)
{
int ans = 1;
for (int j = 1; j <= m; j++)
if (s[i][j] == 'U')
f[i][j] = ans, ans = -ans, f[i + 1][j] = ans;
}
for (int j = 1; j <= m; j++)
{
int ans = 1;
for (int i = 1; i <= n; i++)
if (s[i][j] == 'L')
f[i][j] = ans, ans = -ans, f[i][j + 1] = ans;
}
for (int i = 1; i <= n; i++)
{
int sum_row = 0;
for (int j = 1; j <= m; j++)
sum_row += f[i][j];
if (sum_row)
fail = 1;
}
for (int j = 1; j <= m; j++)
{
int sum_col = 0;
for (int i = 1; i <= n; i++)
sum_col += f[i][j];
if (sum_col)
fail = 1;
}
if (fail)
{
cout << -1 << '\n';
return;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (f[i][j])
cout << (f[i][j] == 1 ? 'W' : 'B');
else
cout << '.';
}
cout << '\n';
}
}
// void _()
// {
// int n, m;
// cin >> n >> m;
// vector<string> s(n + 1);
// for (int i = 1; i <= n; i++)
// cin >> s[i], s[i] = ' ' + s[i];
// vector<vector<int>> f(n + 1, vector<int>(m + 1));
// bool fail = 0;
// for (int i = 1; i <= n; i++)
// {
// int sum_row = 0;
// for (int j = 1; j <= m; j++)
// {
// if (s[i][j] - '.')
// f[i][j] = i + j & 1 ? 1 : -1;
// sum_row += f[i][j];
// }
// if (sum_row)
// fail = 1;
// }
// for (int j = 1; j <= m; j++)
// {
// int sum_col = 0;
// for (int i = 1; i <= n; i++)
// sum_col += f[i][j];
// if (sum_col)
// fail = 1;
// }
// if (fail)
// {
// cout << -1 << '\n';
// return;
// }
// for (int i = 1; i <= n; i++)
// {
// for (int j = 1; j <= m; j++)
// {
// if (f[i][j])
// cout << (f[i][j] == 1 ? 'W' : 'B');
// else
// cout << '.';
// }
// cout << '\n';
// }
// }