首页 > 其他分享 >Codeforces Round #832 (Div. 2) D (预处理+二分)

Codeforces Round #832 (Div. 2) D (预处理+二分)

时间:2022-11-06 17:12:43浏览次数:80  
标签:832 int sum Codeforces Round 异或 区间 查询 我们

D. Yet Another Problem

观察题干 发现一定要是odd
考虑发掘性质 发现之后还会将[l,r]长度为奇数的区间全部赋值成这个区间的异或和
我们设长度为len len-1个偶数个异或为0 最后一个异或剩下来还是总体的异或和
也就是我们进行了一次操作后异或和是不变的
我们考虑用这个性质
对于查询[l,r]要是区间异或和不为0 因为无论如何 我们异或和是不变的 所以肯定不可能变成0
我们继续思考
要是查询长度是奇数 我们可以通过一次全部直接完成
要是查询的全部都是0 我们可以直接输出0 这个可以通过处理前缀和完成 因为我们都是正数所以sum[l-1]sum[r] 就是这个区间都是0
要是查询长度为偶数 我们要是左右两边有一个0 那我们这个就可以看作一个0+一个奇数长度 就是1
要是两边没有0 我们知道我们区间异或和=0 也就是s[l-1]^s[r]
0 等价于 s[l-1]s[r] 且l,r的奇偶性相同
所以我们只用查询区间内是否还有一个点与l,r寄偶性不同 并且 s[x]
s[l-r]==s[r]这样我们就可以通过两次操作把整个区间变为0了
最后注意我们的s[x]值域很大 我们要离散化 还有寄偶性不同的要分别放进不同的map方便查询 最后用指针比较方便判断end()

void solve(){
     int n,q;cin>>n>>q;
     vector<int>a(n+10),s(n+10),sum(n+10);
     map<int,vector<int>>v1,v;
     for(int i=1;i<=n;i++){
         cin>>a[i];
         s[i]=a[i];
         s[i]^=s[i-1];
         sum[i]=a[i]+sum[i-1];
         if(i&1)v1[s[i]].push_back(i);
         else v[s[i]].push_back(i);
     }
     while(q--){
         int l,r;cin>>l>>r;
         int len=r-l+1;
         if(s[l-1]^s[r]){
             cout<<-1<<endl;
             continue;
         }
         if(sum[l-1]==sum[r]){
             cout<<0<<endl;
             continue;
         }
         if(len&1){
             cout<<1<<endl;
         }else{
             if(a[l]==0||a[r]==0){
                 cout<<1<<endl;
             }else{
                 if((l-1)&1){
                     auto it=lower_bound(all(v[s[l-1]]),l-1);
                     if(it!=v[s[l-1]].end()&&*it<r){
                         cout<<2<<endl;
                         continue;
                     }
                 }else{
                     auto it= lower_bound(all(v1[s[l-1]]),l-1);
                     if(it!=v1[s[l-1]].end()&&*it<r){
                         cout<<2<<endl;
                         continue;
                     }
                 }
                 cout<<-1<<endl;
             }
         }
     }
}

标签:832,int,sum,Codeforces,Round,异或,区间,查询,我们
From: https://www.cnblogs.com/ycllz/p/16863051.html

相关文章

  • Codeforces-1753B Factorial Divisibility题解
    Codeforces-1753BFactorialDivisibility参考:https://blog.csdn.net/qq_38236082/article/details/127500190题意:问$a_1!+a_2!+a_3!+...+a_n!$能否被$x!$整除。......
  • CodeForces 1747E List Generation
    CF传送门洛谷传送门考虑将问题抽象成:左上角为\((0,0)\)、右下角为\((n,m)\)的网格图,求所有满足至少有一条只向下或向右走的路径经过点集内所有点的的不同的点集大......
  • 背景缩放 background-size
    背景缩放background-sizebackground-size属性规定背景图像的尺寸background-size:背景图片宽度背景图片宽度;单位:长度I百分比lcoverlcontain;cover把背景图像扩......
  • Educational Codeforces Round 138 E,F
    E一道比较基础的题。首先就是纵向,走无障碍的格子,无法四联通和横向,走有障碍的格子,八联通是等价的。也就是,如果我们要让其不存在非法路径,那么应该存在一个从第一列出发,一......
  • 使用AspectJ-@AfterReturning(returning ret),@Around (ProceedingJoinPoint pjp)环绕
    开始使用AspectJ1.[掌握]@AfterReturning后置通知-注解有returning属性在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回值。该注解......
  • Educational Codeforces Round 118 D
    D.MEXSequences对于一个数x要是前面出现过0,1,2...x-1我们显然可以将他放在后面要是前面出现过012...x-1x我们也可以将他放在后面但是观察样例还有一种情况......
  • UVA1364 Knights of the Round Table | 点双连通分量
    主要就是一个性质:如果一个点双连通分量中有奇环,那么这个点双连通分量中的每个点都在至少一个奇环中。#include<bits/stdc++.h>usingnamespacestd;constintN=100......
  • Codeforces Round #826 (Div. 3) D. Masha and a Beautiful Tree(树+dfs)
    D.MashaandaBeautifulTree题目大意:给定一颗满二叉树的叶子节点,让我们更换子树位置,从而让叶子节点排序为升序求最小操作数,如果不能移动成那样的话,直接输出-1.in......
  • [Public NOIP Round #3]图同构
    点权和颜色的操作不对称,尝试转化为同类操作。对于颜色的操作可以看作:交换两点颜色,然后反色那么可以将颜色和点权绑在一起交换,最终颜色是否反色取决于路径长度的奇偶性。......
  • Codeforces 杂题记录
    CF1753A2(调整、贪心)考虑钦定\([1,n]\)分成一段,调整就是把贡献取相反数。CF1753B每次把\((i+1)\)和\(i!\)合并成一个\((i+1)!\),看能不能合并到\(x!\)。CF1753C(......