首页 > 其他分享 >Codeforces 1863F Divide, XOR, and Conquer

Codeforces 1863F Divide, XOR, and Conquer

时间:2024-04-22 21:57:30浏览次数:18  
标签:1863F 那么 XOR int 遍历 maxn 端点 Conquer 考虑

记 \(s_{l, r} = \oplus_{i = l}^r a_i\)。

考虑到这个相当于是 \([l, r]\) 内分裂区间,可以考虑区间 \(\text{DP}\)。
即记 \(f_{l, r}\) 为 \([l, r]\) 区间是否能被遍历到。

转移考虑对于 \([l, r]\),考虑在已知的条件下(\(len\ge r - l + 1\))\([l, r]\) 是否合法。
即到这个状态时再从之前的状态算过来。

考虑到因为拆分区间 \(l, r\) 肯定不动。
假设 \(l\) 不动,那么就相当于是 \([l, R]\to [l, r](R > r)\),不妨就考虑由 \(s_{l, r}\) 和 \(s_{l, R}\) 来判断 \([l, R]\) 能否遍历到 \([l, r]\)。
那么有 \(s_{r + 1, R} = s_{l, r}\oplus s_{l, R}\)。

  1. 首先若 \(s_{l, R} = 0\),那么肯定有 \(s_{r + 1, R} = s_{l, r}\),那么 \([l, r]\) 肯定能被遍历到。
  2. 否则考虑令 \(w = \operatorname{highbit}(s_{l, R})\),那么因为 \(> w\) 位 \(s_{l, R}\) 都为 \(0\),那么这些位 \(s_{l, r}\) 和 \(s_{r + 1, R}\) 肯定都是相同的,然后到了第 \(w\) 位,因为在这一位 \(s_{l, R}\) 为 \(1\),那么这一位 \(s_{l, r}\) 和 \(s_{r + 1, R}\) 肯定不同。
    所以说在第 \(w\) 位若 \(s_{l, r}\) 为 \(1\) 那么 \([l, r]\) 就能被遍历到。

发现这些信息都只需要在左端点和右端点的时候维护。
对于第一种情况,只需要记录对应端点存不存在合法且异或和 \(= 0\) 的区间。
对于第二种情况,例如左端点 \(l\),记录一个 \(g_{l, w}\) 为是否存在 \([l, r]\) 满足 \([l, r]\) 合法且 \(\operatorname{highbit}(s_{l, r}) = w\)。
那么判断的时候就相当于是询问是否存在位 \(i\) 使得 \(g_{l, i} = 1\) 且 \(s_{l, r}\) 第 \(i\) 位为 \(1\)。
那么这个就相当于是取交集,就可以用 \(\operatorname{bitand}\) 来快速算。

时间复杂度 \(\mathcal{O}(n^2)\)。

代码
#include<bits/stdc++.h>
using ull = unsigned long long;
const int maxn = 1e4 + 10;
ull a[maxn];
ull fl[maxn], fr[maxn];
int fl0[maxn], fr0[maxn];
inline void Main() {
   int n;
   scanf("%d", &n);
   for (int i = 1; i <= n; i++)
      scanf("%llu", &a[i]), a[i] ^= a[i - 1];
   for (int i = 1; i <= n; i++)
      fl[i] = fr[i] = 0, fl0[i] = fr0[i] = 0;
   for (int len = n; len; len--)
      for (int l = 1, r = len; r <= n; l++, r++) {
         ull v = a[r] ^ a[l - 1];
         int f = len == n || ((v & fl[l]) > 0) || ((v & fr[r]) > 0) || fl0[l] || fr0[r];
         if (l == r) printf("%d", f);
         if (f) {
            if (! v)
               fl0[l] = fr0[r] = 1;
            else
               fl[l] |= 1ull << std::__lg(v), fr[r] |= 1ull << std::__lg(v);
         }
      }
   puts("");
}
int main() {
   int T;
   scanf("%d", &T);
   while (T--)
      Main();
   return 0;
}

标签:1863F,那么,XOR,int,遍历,maxn,端点,Conquer,考虑
From: https://www.cnblogs.com/rizynvu/p/18151636

相关文章

  • ICPC World Finals Luxor 游记
    流水账开场我先看了一下J,简单贪了一下,没有什么结果,就丢给pb了。然后pb这时候抛过来一个C,我上去写完发现过不去样例,有点小爆。过了一会儿pb发现样例输入藏东西了,我改了改就过样例了,然后交了一发wa,血压有点拉起来了。fsy这时候上去签了A,我当时看了一遍C没瞪出问题,然......
  • Codeforces 1824C LuoTianyi and XOR-Tree
    考虑到肯定如果能在这个节点让子树的值尽量相同肯定更好,这样子不会与上面的操作相冲突。于是有个\(\text{DP}\)的思路。记\(f_{u,i}\)为\(u\)子树内叶子节点的值都变为\(i\)的最小代价。这个有一个很好的性质,就是\(\maxf_{u,i}-\minf_{u,i}=1\)。这是因为考......
  • CF1788F XOR, Tree, and Queries
    CF1788FXOR,Tree,andQueries边权转点权+染色+构造首先对于限制,可以转化。设\(f_u\)表示\(1\)到\(u\)的异或和,那么限制\((u,v,w)\)就可以表示为\(f_u\oplusf_v=w\)。也就意味这如果我们将限制\((u,v,w)\)连边,要考虑的就变成\(f_u\)的赋值问题。这一步将边权转......
  • CF617E XOR and Favorite Number 题解
    想了好久才明白zz来源?:莫队题单题目大意给定一个长度为\(n\)的序列\(a\),然后再给一个数字\(k\),再给出\(m\)组询问,每组询问给出一个区间,求这个区间里面有多少个子区间的异或值为\(k\)。\(1\len,m\le10^5\)\(0\lek,a_i\le10^6\)\(1\lel_i,r_i\len\)题......
  • P4139TriangleXor
    数学#计数#容斥分为\(4\)个部分计算上面的按奇偶性分类下面的按每一层容斥,即\(siz_i-2\timessiz_{i-1}+siz_{i-2}\)左右直接对每一块计算面积//Author:xiaruizeconstintINF=0x3f3f3f3f3f3f3f3f;constintMOD=1000000007;constintN=2e5+10;intn;......
  • D. XOR Construction
    题解首先根据b1⊕b2=a1,b2⊕b3=a2...bj⊕bj+1=aj我们不难得出b1​⊕bj+1=a1⊕a2⊕a3....⊕aj因此我们只需要确定b1的值就能够确定其余所有bi的值,而题目又要求我们的b处于0~n-1范围内,这实际上实在寻找一个 b1​ 使得异或出来的所有值越小越好,所以我们拆位,假设所有数字的第 i ......
  • AtCoder Regular Contest 173 E Rearrange and Adjacent XOR
    洛谷传送门AtCoder传送门不妨考虑最后的结果可以成为哪些\(a_i\)的组合。为了方便分析,我们令\(a_i=2^{i-1}\)。进行一次操作后,所有\(\text{popcount}(a_i)\)都为偶数。所以一个\(x\in[0,2^n-1]\)能被生成出来的必要条件是\(\text{popcount}(x)\)为偶数。然......
  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • Atcoder ARC165D Xor Sum 5
    考虑到这个最终的答案是\(\oplus\),所以只需要考虑每种排列出现的次数的奇偶,如果为奇再计算贡献即可。考虑什么情况下出现次数为奇。令每个数出现的个数为\(c_{1\simn}\),方案数即为\(\dbinom{k}{c_1,c_2,\cdots,c_n}=\prod_{i=1}^n\dbinom{k-\sum\limits_{j=1}^{......
  • XOR Break — Solo Version
    题意思路最多两步解决1.一步:只要满足((n^m)<n)即可一步,只要在第一个mi=1的地方n也有1无论如何都可以随便改n得到m2.无解的情况:只要在第一个mi=1的时候n(i)->n(最高位-1)没有1出现肯定无法解决3.二步:类似于10110->0000110110->10101->00001只需......