全部评论 5

  • 老师好帅

    2026-08-02 来自 广东

    3
  • 老帅好师

    2026-08-02 来自 广东

    1
  • 补一个挑战题

    //本题其实可以理解为线段上的区间覆盖问题(很经典的贪心题),通过前缀异或求得区间后贪心即可
    //贪心的思路是优先选右端点小的,如果相同再选左端点大的
    #include<bits/stdc++.h>
    using namespace std;
    int pre[500009];//前缀异或数组
    unordered_map<int,priority_queue<int>> mp;//priority_queue自动降序排序左端点
    int main(){
        int n,k;
        cin>>n>>k;
        int ans=0;
        mp[0].push(0);
        int last=0;//初始化
        for(int i=1;i<=n;i++){
            int x;
            cin>>x;
            pre[i]=pre[i-1]^x;//输入+运算
            if(!mp[pre[i]^k].empty() && mp[pre[i]^k].top()>=last){//寻找可行的左端点
                ans++;//可行,则将答案+1,并更新上一个右端点
                last=i;
            }
            mp[pre[i]].push(i);
        }
        cout<<ans;
        return 0;
    }
    

    2026-08-03 来自 广东

    0
  • 2026-08-02 来自 广东

    0

热门讨论