2025.2.15——1400
A 1400
B 1400
C 1400
------------------------------------------------
A
- 单独对一个数进行分析什么情况下会有贡献。
- 在前面且所有比其小的数,都必须是最小前缀。
- 两个树状数组记录小的个数和最小前缀的个数。遍历维护信息可以做到不使用树状数组(思维点)。
B
- 模拟发现可以获得所有区间异或和。但没有证明只能获得所有区间异或和。
猜一发。
- 数组元素种类最多只有256个,同类相消,前缀异或和最多也只有256种。
C
- 分类讨论+思维
------------------------代码------------------------
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;
}void _()
{int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i++)cin >> a[i];int res = 0;int lim = 1e12, mn = 1e12;for (int i = 1; i <= n; i++){res += mn < a[i] && a[i] < lim; // 有选择 并且 在合法区间mn = min(mn, a[i]);if (mn - a[i])lim = min(lim, a[i]);}cout << res << '\n';
}
// // 树状数组 快速求前缀和
// // 维护差分数组(区间加) 位置(统计个数) ...
// struct Tree
// {
// int n;
// vector<int> tr;
// Tree(int n1)
// {
// n = n1 + 2;
// tr.assign(n + 2, 0);
// }
// void add(int x, int c) // 加点
// {
// for (int i = x; i <= n; i += i & -i)
// tr[i] += c;
// }
// int ask(int x) // 前缀查询
// {
// int res = 0;
// for (int i = x; i; i -= i & -i)
// res += tr[i];
// return res;
// }
// int ask(int l, int r) // 区间查询
// {
// if (l > r)
// return 0ll;
// return ask(r) - ask(l - 1);
// }
// }; // Tree tr(n); tr.add(x,c)// void _()
// {
// int n;
// cin >> n;
// vector<int> a(n + 1);
// for (int i = 1; i <= n; i++)
// cin >> a[i];
// Tree cnt(n), pre_cnt(n);// int pre_mn = 1e12;
// int res = 0;
// for (int i = 1; i <= n; i++)
// {
// if (cnt.ask(1, a[i]) && cnt.ask(1, a[i]) == pre_cnt.ask(1, a[i]))
// res++;
// pre_mn = min(pre_mn, a[i]);
// cnt.add(a[i], 1);
// if (pre_mn == a[i])
// pre_cnt.add(a[i], 1);
// }
// cout << res << '\n';
// }
B
#include <bits/stdc++.h>
#define int long long
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 << ' '; \cout << '\n'; \}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 _()
{// srand(time(0));int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i++)// a[i] = rand() % 256;cin >> a[i];// bugv(a);set<int> s;s.insert(0);int pre = 0, res = 0;for (int i = 1; i <= n; i++){pre ^= a[i];for (auto x : s){res = max(res, pre ^ x);}s.insert(pre);}cout << res << '\n';
}
C
#include <bits/stdc++.h>
#define int long long
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 << ' '; \cout << '\n'; \}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 mx = -20;int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i++){cin >> a[i];mx = max(mx, a[i]);}vector<pair<int, int>> res;auto add = [&](int i, int j){a[i] += a[j];res.push_back({i, j});};if (mx < 1){for (int i = n - 1; i; i--){add(i, i + 1);}}else{int id = 1;for (int i = 1; i <= n; i++){if (a[i] == mx){id = i;break;}}int t = 10;while (t--){add(id, id);}add(1, id);for (int i = 2; i <= n; i++){add(i, i - 1);add(i, i - 1);}}// bool f = 1;// for (int i = 2; i <= n; i++)// {// if (a[i] - a[i - 1] < 0)// {// f = 0;// }// }// bug(f);cout << res.size() << '\n';for (auto [i, j] : res){cout << i << ' ' << j << '\n';}// bug(20ll << 44);// bugv(a);
}