• 【分类讨论】CF1747D


    Problem - D - Codeforces

    题意

    思路

    一看这个做法一定就是分类讨论

    先判无解

    显然,如果区间异或和不是0一定无解

    如果区间内全是0,答案一定是0

    之后怎么讨论

    注意到需要讨论区间长度

    如果长度是奇数,那么直接操作即可,答案一定是1

    else 如果是偶数,需要看是否存在一个分割点使得一个区间可以分割成两个区间,两个区间的区间异或和都是0

    这点有点难注意到,我们很容易地会以为如果一个区间的异或和是0,一定存在分割点,其实不一定,这点需要记住

    那么问题就是如何找这个分割点

    这个分割点假设是 k, 需要满足pre[l - 1] == pre[k] 且 位置的奇偶性要和 l 一致,因为区间长度要是奇数,那么就是去找后面第一个满足这个条件的就行

    那么就是把所有前缀异或和为 pre[l - 1]和位置的奇偶性放进集合里,二分查找即可

    Code:

    1. #include
    2. #define int long long
    3. constexpr int N = 2e5 + 10;
    4. constexpr int mod = 998244353;
    5. std::map<int, std::vector<int> > S[2];
    6. int n, q;
    7. int a[N];
    8. int pre[N];
    9. int s[N];
    10. int get(int l, int r) {
    11. return pre[r] ^ pre[l - 1];
    12. }
    13. void solve() {
    14. std::cin >> n >> q;
    15. pre[0] = 0;
    16. for (int i = 1; i <= n; i ++) {
    17. std::cin >> a[i];
    18. pre[i] = pre[i - 1] ^ a[i];
    19. s[i] = s[i - 1] + (a[i] == 0);
    20. S[i & 1][pre[i]].push_back(i);
    21. }
    22. while(q --) {
    23. int l, r;
    24. std::cin >> l >> r;
    25. if (get(l, r) != 0) {
    26. std::cout << -1 << "\n";
    27. continue;
    28. }
    29. if (s[r] - s[l - 1] == r - l + 1) {
    30. std::cout << 0 << "\n";
    31. continue;
    32. }
    33. if ((r - l + 1) % 2 == 1 ||((r - l + 1) % 2 == 0 && (a[l] == 0 || a[r] == 0))) {
    34. std::cout << 1 << "\n";
    35. }else {
    36. auto it = std::lower_bound(S[l & 1][pre[l - 1]].begin(), S[l & 1][pre[l - 1]].end(), l);
    37. if (it != S[l & 1][pre[l - 1]].end() && *it < r) {
    38. std::cout << 2 << "\n";
    39. }else {
    40. std::cout << -1 << "\n";
    41. }
    42. }
    43. }
    44. }
    45. signed main() {
    46. std::ios::sync_with_stdio(false);
    47. std::cin.tie(nullptr);
    48. int t = 1;
    49. while (t--) {
    50. solve();
    51. }
    52. return 0;
    53. }

  • 相关阅读:
    [附源码]计算机毕业设计JAVA学生宿舍管理系统
    WebAssembly学习笔记(一)
    优化故事: BLOOM 模型推理
    【Java】判断字符串为空
    openwrt (一):特殊的WiFi驱动移植方法
    基于Mxnet实现语义分割-整体多模型【完整、附部分源码】
    Open3D(C++) Ransac拟合平面分割点云
    使用 PHP 和 MySQL 的安全登录系统
    交互式表达式求值(支持多种类型的运算符)
    微服务环境搭建
  • 原文地址:https://blog.csdn.net/weixin_62528401/article/details/133966231