传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个数组aaa,让你实现以下两个操作之后输出数组aaa。

n≤6e5,ai≤230−1n\le6e5,a_i\le2^{30}-1n≤6e5,ai​≤230−1

思路:

下面介绍的思路清奇,反正我想不到。
对于两个操作,显然对于异或操作顺序是没有影响的,所以对于第一个操作可以直接打个差分即可。
对于第二个操作,我们本能的想把括号拆开,但是括号中是加法对于异或来说没有分配律,所以考虑(x+(i−l))(x+(i-l))(x+(i−l))将加法转换成或,假设xxx的111的最低位置在2k2^k2k处,如果i−l<2ki-l<2^ki−l<2k,那么此时(x+(i−l))=(x∣(i−l))(x+(i-l))=(x|(i-l))(x+(i−l))=(x∣(i−l)),此时ai⊕(x+(i−l))=ai⊕(x∣(i−l))=ai⊕x⊕(i−l)a_i\oplus (x+(i-l))=a_i\oplus (x|(i-l))=a_i\oplus x \oplus (i-l)ai​⊕(x+(i−l))=ai​⊕(x∣(i−l))=ai​⊕x⊕(i−l),也就是先让iii位置异或上xxx,让后让[i,i+2k−1][i,i+2^k-1][i,i+2k−1]的位置分别异或上0,1,...,2k−10,1,...,2^k-10,1,...,2k−1。所以我们记一个f[k][i]f[k][i]f[k][i]数组表示是否需要将[i,i+2k−1][i,i+2^k-1][i,i+2k−1]的位置分别异或上0,1,...,2k−10,1,...,2^k-10,1,...,2k−1,之后将x+(1<<k),l+(1<<k)x+(1<<k),l+(1<<k)x+(1<<k),l+(1<<k)即可。
这样一直推下去,到最后会剩下一段小区间,这段区间我们直接倒着来一遍即可,因为他的后k−1k-1k−1位都是000,所以也满足上面的性质。
我们记了一个fff数组,个人感觉怎么用它也是一个比较难想到的点。我们可以用类似倍增实则是倍增的逆过程来递推下去,是一种分治的思想。
考虑当前遍历到了f[i][k]f[i][k]f[i][k],那么我们可以将其分成两段来看,两段分别是[i,i+2k−1−1],[i+2k−1,i+2k−1][i,i+2^{k-1}-1],[i+2^{k-1},i+2^{k}-1][i,i+2k−1−1],[i+2k−1,i+2k−1]。
对于第一段,我们直接将f[i][k−1]f[i][k-1]f[i][k−1]标记一下,让后等分治下去处理即可。对于
对于第二段,我们将f[i+2k−1][k−1]f[i+2^{k-1}][k-1]f[i+2k−1][k−1]标记一下,这样还不够,因为这一位及其之后应该异或上2k−1,2k−1+1,...,2k−12^{k-1},2^{k-1}+1,...,2^k-12k−1,2k−1+1,...,2k−1,根据上面的转换公式,我们可以将i+2k−1i+2^{k-1}i+2k−1差分数组的位置异或上2k−12^{k-1}2k−1即可,这样就可以不断的分治递推下去,代码写起来很像倍增的逆过程。。

// Problem: Kuriyama Mirai and Exclusive Or
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11254/I
// Memory Limit: 131072 MB
// Time Limit: 6000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int a[N];
int d[N],f[30][N];int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);while(m--) {int op,l,r,x; scanf("%d%d%d%d",&op,&l,&r,&x);if(op==0) d[l]^=x,d[r+1]^=x;else {int k=0;while(l+(1<<k)-1<=r) {if(x>>k&1){int now=l+(1<<k);d[l]^=x; d[now]^=x;f[k][l]^=1;x+=(1<<k); l=now; }k++;}while(l<=r) {if(l+(1<<k)-1<=r) {int now=l+(1<<k);d[l]^=x; d[now]^=x;f[k][l]^=1;x+=(1<<k); l=now; }k--;}}}for(int i=29;i>=1;i--) {for(int j=1;j<=n;j++) {if(f[i][j]) {f[i-1][j]^=1;f[i-1][j+(1<<(i-1))]^=1;d[j+(1<<(i-1))]^=(1<<(i-1));d[j+(1<<i)]^=(1<<(i-1));}}}for(int i=1;i<=n;i++) d[i]^=d[i-1];for(int i=1;i<=n;i++) printf("%d ",a[i]^d[i]);return 0;
}
/**/

2021牛客暑期多校训练营3 I Kuriyama Mirai and Exclusive Or 差分 + 二进制分治相关推荐

  1. 2021牛客暑期多校训练营9

    2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...

  2. 2021牛客暑期多校训练营5

    2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...

  3. 2021牛客暑期多校训练营4

    2021牛客暑期多校训练营4 题号 题目 知识点 A Course B Sample Game C LCS D Rebuild Tree E Tree Xor 思维+线段树 F Just a joke ...

  4. 2021牛客暑期多校训练营3

    2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...

  5. 2021牛客暑期多校训练营2

    2021牛客暑期多校训练营2 题号 题目 知识点 A Arithmetic Progression B Cannon C Draw Grids D Er Ba Game E Gas Station F ...

  6. 2021牛客暑期多校训练营1

    2021牛客暑期多校训练营1 题号 题目 知识点 难度 A Alice and Bob 博弈论 B Ball Dropping 计算几何 签到 C Cut the Tree D Determine t ...

  7. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

  8. 2021牛客暑期多校训练营1, 签到题DFBG

    2021牛客暑期多校训练营1 题号 标题 已通过代码 通过率 团队的状态 A Alice and Bob 点击查看 1365/5586 通过(博弈论-打表) B Ball Dropping 点击查看 ...

  9. 【训练题66:状压暴力 | 子集dp】Greater Integer, Better LCM | 2021牛客暑期多校训练营5

    题意 Greater Integer, Better LCM | 2021牛客暑期多校训练营5 给你 a,b,ca,b,ca,b,c ,你需要找到一对 x,yx,yx,y ,满足: lcm(a+x,b ...

最新文章

  1. 重新编号_武汉黄陂公交线路PW、PG、PZ……分不清?别急,就要重新编号啦
  2. 邮件报文格式和MIME
  3. 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter
  4. linux检查运行程序文件,LINUX定时检查程序运行状态
  5. python手机号码正确编程_python 小练习之生成手机号码
  6. [bzoj3994] [SDOI2015]约数个数和
  7. 谁不在清了的飞鸽传书
  8. 小型自动化运维--expect脚本之传递函数
  9. mysql Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  10. flash cs4 如何新增自定义控件
  11. codeblocks20.03汉化版 附汉化补丁|codeblocks汉化版
  12. 解析函数的幂级数理论【无穷级数收敛性】
  13. 云短信使用——阿里云短信使用步骤
  14. 杭电OJ 1095(C++)
  15. 错误代码 ERR_OSSL_EVP_UNSUPPORTED
  16. 格林威治时间转换成字符串
  17. 牛客网数据开发题库_牛客网试题纠错
  18. SW2016提示cosworks.dll无法装入。
  19. 江苏计算机二级c语言考试内容,江苏省计算机二级C语言考试大纲.doc
  20. ubuntu18.04配置ORB-SLAM3并跑EuRoC数据集(单目)

热门文章

  1. 耗时3年,集齐102位中国摄影师,央视这部纪录片BBC也无法超越......
  2. 10岁高分考上大学,16岁读博的95后神童张炘炀,活成了他想要的样子吗?
  3. 看完这些自动化原理图,有一种豁然开朗的感觉
  4. 读书笔记--互联网必读《长尾理论》作者克里斯.安德森
  5. java merge css_一句命令快速合并 JS、CSS
  6. python find函数_Python 速学!不懂怎么入门python的小白看这篇就够了!
  7. kafka 怎么样连接图形化界面_图形化编程有多简单,点亮LED不到一分钟
  8. c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
  9. 抽屉远离在计算机的应用,抽屉原理的应用及其推广优秀毕业论文
  10. aggregation java_Elasticsearch Aggregation 多个字段分组统计 Java API实现