首页 > 其他分享 >CF1713F Lost Array 题解

CF1713F Lost Array 题解

时间:2024-04-19 22:12:17浏览次数:18  
标签:ch 题解 long CF1713F 异或 FF Array 高维 define

题目链接

点击打开链接

题目解法

很牛的题!!!

先考虑 \((0,i)\) 对 \((j,n)\) 的贡献,因为是异或,所以只要考虑奇偶性
问题可以抽象成一条路径对应 \(a_i\) 的贡献,所以是否有 \(a_i\) 的贡献看 \(\binom{n-i+j-1}{j-1}\) 的奇偶性
根据 \(kummer\) 定理,这个组合数是奇数当且仅当 \(n-i+j-1\) 是 \(j-1\) 的超集,等价于 \((n-i)\&(j-1)=0\)
令新的 \(i'=n-i,j'=j-1\)(下面仍以 \(i,j\) 代指 \(i',j'\))

接下来的我的思路就和正解不一样了
考虑 \(b_j\) 的值是 \(j\) 的补集的子集的 \(a\) 之和,这个东西看似可以还原
但有一点没考虑到:如果要还原的话,\(b\) 必须是满的 \(2\) 的次幂项,否则前面会有 \(0\)
这就直接 \(ban\) 掉了这个做法

换个角度想
限制是 \(i\&j=0\),不妨容斥 \(i\&j\) 是 \(k\) 的超集
令 \(c_i\) 为满足 \(i|j\) 的 \(a_j\) 的异或和,即 \(c\) 是 \(a\) 的高维后缀异或和
则 \(b\) 不难发现为 \(c\) 的高维前缀异或和
把操作反过来,因为异或的和与差是一样的,所以先做一遍高维后缀异或和,在做高维前缀异或和就可以还原出 \(a\),时间复杂度 \(O(n\log n)\)

感觉容斥直接把思路打开了

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=500010;
int n,f[N];
int main(){
    read(n);
    int lg=log2(n);
    F(i,0,n-1) read(f[i]);
    F(i,0,lg) F(j,0,n-1) if(j>>i&1) f[j]^=f[j-(1<<i)];
    F(i,0,lg) F(j,0,n-1) if(j>>i&1) f[j-(1<<i)]^=f[j];
    DF(i,n-1,0) printf("%d ",f[i]);puts("");
    return 0;
}

标签:ch,题解,long,CF1713F,异或,FF,Array,高维,define
From: https://www.cnblogs.com/Farmer-djx/p/18146868

相关文章

  • [题解][洛谷P1412] 经营与开发
    题目描述给定n,k,c,w,然后输入n组数据,数据分为两种:1ai:可以选择获得aiw的价值,但w会变成w(1-0.01*k)2bi:可以选择损失biw的价值,但w会变成w(1+0.01*c)求可获得的最大价值是多少。题解看到这个题,我的第一思路是求后缀和,然后让新得到的系数乘后缀和判断是否进行操作。但问题在于,对于......
  • 高斯消元学习笔记——P304题解
    如果你觉得这篇太啰嗦问题[SDOI2006]线性方程组题目描述已知\(n\)元线性一次方程组。\[\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\cdots\\a_{n,1}x_1+a_{n,2}x......
  • ABC349F题解
    思想看到LCM想到质因数分解。首先,我们先把\(M\)质因数分解了,根号复杂度刚好1e8级别。然后我们发现一个很显然的性质:如果一个数不是\(M\)的因数那他肯定没用。所以此处我们就把不是因数地踢掉。我们惊奇地发现因为\(M\)的质因数分解最多\(13\)个不同的质数,然后我......
  • 题解 LGP5397【[Ynoi2018] 天降之物】/ 第四分块
    题解P5397【[Ynoi2018]天降之物】/第四分块题目描述一个长为\(n\)的序列\(a\)。你需要实现\(m\)个操作,操作有两种:把序列中所有值为\(x\)的数的值变成\(y\)。找出一个位置\(i\)满足\(a_i=x\),找出一个位置\(j\)满足\(a_j=y\),使得\(|i-j|\)最小,并输出\(|i-......
  • vsCode无法连接服务器问题解决及思考
    背景早上刚打开电脑,准备开始一天的工作。但是发现VSCode无法连接上我的虚拟机了,导致无法工作了,这让我十分头疼。最终花了将近一天的时间将问题解决,但是其中的过程走了不少弯路,浪费了不少时间,也进行了反思。我们作为开发人员,应该要用软件思维去理解这款产品,帮助我们去思考问题。......
  • P4168 [Violet] 蒲公英(题解)
    题目题目描述输入格式输出格式数据范围![]样例输入:63123212153615输出:121思路暴力本题求区间内的最小众数,容易想到去用数组sum[i]表示第i种花的个数,在去便利比较,但是复杂度nm一定会T,这时候就要对暴力进行优化。分块优化1如果我们将所......
  • Codeforces Round 932 (Div. 2)题解(c、d)
    CodeforcesRound932(Div.2)C.MessengerinMAC题目大意给定一些\(a_i\)\(和b_i\),选出尽量多的\(a_i和b_i\),使得\(\sum_{i=1}^ka_{p_i}+\sum_{i=1}^{k-1}\left|b_{p_i}-b_{p_{i+1}}\right|\)小于给定的\(l\)。题目解析由于题目没有要求\(\{p\}\)是升序排列的序列,因此......
  • P6018 [Ynoi2010] Fusion tree 题解
    题目链接:Fusiontree大部分人貌似用的边权01Trie,实际这题用点权01Trie类似文艺平衡树去写更方便。考虑两种常见的区间维护:线段树。使用的是父节点信息是归并了左右区间的信息,适用于不需要考虑父节点的贡献的信息。文艺平衡树。每个点就是一个信息,归并左右子树,外加当......
  • kafka消息只能在一台服务器消费的问题解决过程
    场景:kafka消费端应用部署在两台机器上,其中一台能消费到生产端发出的kafka消息,另一台服务器接收不到任何消息。解决过程:一、从消费端启动日志中找出所有消费端线程2024-04-2320:04:44,726[xx_xxapp03-1556011171628-976bc2af_watcher_executor]INFOkafka.consumer.RangeA......
  • PKUSC2019 D1T1 题解
    前言五一网课的例题,但是网上没有详细的题解(其实就是都没放代码),所以来写一篇。题目可以在这里提交。题目简述有\(n\)(\(n\leq5\times10^5\))个村庄排成一排,每个村庄里有一个人。第\(i\)个村庄里的人要去第\(p_i\)个村庄,且\(p\)是\(1\simn\)的一个排列。他们出行......