题目链接:点击查看

题目大意:给出一个长度为 nnn 的序列,现在需要执行 mmm 次操作,每次操作分为下列两种类型:

  1. 0 l r x:区间 [l,r][l,r][l,r] 内的数都异或上 xxx
  2. 1 l r x:区间 [l,r][l,r][l,r] 内的数异或上一个首项为 xxx 公差为 111 的等差序列,具体来说就是 a[l]⊕x,a[l+1]⊕(x+1),...,a[r]⊕(x+r−l)a[l]\oplus x,a[l+1]\oplus (x+1),...,a[r]\oplus (x+r-l)a[l]⊕x,a[l+1]⊕(x+1),...,a[r]⊕(x+r−l)

最后需要输出最终的序列

题目分析:第一个操作通过差分很容易维护,关键是第二个操作的等差数列该如何维护,因为异或操作对于加法操作不具有分配律,所以我们需要将区间拆解

具体而言就是,设 k=log(lowbit(x))k=log(lowbit(x))k=log(lowbit(x)),对于值域区间 [x,x+2k)[x,x+2^{k})[x,x+2k) 来说,因为 xxx 转换成二进制后的低 iii 位都是 000,所以原本需要异或的 x+(i−l)x+(i-l)x+(i−l) 就可以拆成 x⊕(i−l)x\oplus (i-l)x⊕(i−l),所以可以将每次需要进行第二种操作的区间都拆成 logloglog 个类似的区间进行维护,更具体的,维护一个倍增差分数组 c[i][j]c[i][j]c[i][j],代表区间 [i,i+(1<<j))[i,i+(1<<j))[i,i+(1<<j)) 需要分别异或上等差数列 {1,2,3,...,2j−1}\{1,2,3,...,2^{j}-1\}{1,2,3,...,2j−1},每次更新的时候同时维护原差分数组和倍增差分数组就可以了

还原的时候类似于线段树的pushdown,也类似于倍增的下压,O(nlogn)O(nlogn)O(nlogn) 处理一下就可以得到正确的原差分数列了

代码:

// 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(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int a[N],b[N],c[N][20],n,m;
void add(int l,int r,int x) {if(l>r) {return;}if(l<=n) {b[l]^=x;}if(r+1<=n) {b[r+1]^=x;}
}
void add_tag(int x,int k) {c[x][k]^=1;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);read(n),read(m);for(int i=1;i<=n;i++) {read(a[i]);}while(m--) {int op,l,r,x;read(op),read(l),read(r),read(x);if(op==0) {add(l,r,x);} else if(op==1) {for(int i=0;i<=19;i++) {if(((x>>i)&1)&&l+(1<<i)-1<=r) {int ll=l,rr=l+(1<<i)-1;add(ll,rr,(x>>i)<<i);add_tag(l,i);x+=(1<<i);l+=(1<<i);}}for(int i=19;i>=0;i--) {if(l+(1<<i)-1<=r) {int ll=l,rr=l+(1<<i)-1;add(ll,rr,(x>>i)<<i);add_tag(l,i);l+=(1<<i);x+=(1<<i);}}}}for(int i=19;i>=1;i--) {for(int j=1;j<=n;j++) {if(!c[j][i]) {continue;}int l=j+(1<<(i-1)),r=j+(1<<i)-1;c[j][i-1]^=1;if(l<=n) {c[l][i-1]^=1;add(l,r,1<<(i-1));}}}for(int i=1;i<=n;i++) {b[i]^=b[i-1];printf("%d ",a[i]^b[i]);}return 0;
}

2021牛客多校3 - Kuriyama Mirai and Exclusive Or(差分+倍增)相关推荐

  1. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

  2. 【2021牛客多校2】F-Girlfriend 计算几何

    2021牛客多校2-F F-Girlfriend 题目大意 给出四个点 A , B , C , D A, B, C, D A,B,C,D 另有两点 P 1 , P 2 P_1, P_2 P1​,P2​ ...

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

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,让你实现以下两个操作之后输出数组aaa. n≤6e5,ai≤230−1n\le6e5,a_i\le2^{30}-1n≤6e5,ai​≤23 ...

  4. K-Stack 2021牛客多校2

    链接:https://ac.nowcoder.com/acm/contest/11253/K 来源:牛客网 题目描述 ZYT had a magic permutation a1,a2,⋯ ,an a ...

  5. 2021牛客多校第八场补题 D-OR

    链接:https://ac.nowcoder.com/acm/contest/11259/D 来源:牛客网 题目描述 There are two sequences of length n−1n-1n ...

  6. 2021牛客多校第五场补题

    B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n​ boxes in front o ...

  7. 2021牛客多校9 - Cells(推公式+NTT)

    题目链接:点击查看 题目大意:初始时给出 nnn 个点,分别为 {(0,a0),(0,a1),⋯,(0,an)}\{(0,a_0),(0,a_1),\cdots,(0,a_n)\}{(0,a0​),( ...

  8. (2021牛客多校一)A.Alice and Bob(博弈)

    样例输入: 5 2 3 3 5 5 7 7 5 7 7 Bob Alice Bob Bob Alice 题意:有两堆石子,石子数目分别为n和m,Alice和Bob轮流进行以下操作: 从一堆石子中取出k ...

  9. 【多校训练】2021牛客多校5

    [前言] 很久没有时间整理题解了,补题和打游戏的时间居多(doge) 这场其实主要F出题人数据有锅,花太多时间了(赛后重测是一血),然后后面G想歪了爆搜剪枝没过,I的回滚莫队队友前一天写了结果今天写不 ...

最新文章

  1. hdu-2553 N皇后问题(深搜 + 状态压缩)
  2. SpringMVC-方法四种类型返回值总结,你用过几种?
  3. 【报告分享】2021年品牌CDP与营销数字化转型报告.pdf(附下载链接)
  4. 云锵基金 2019 年 02 月简报
  5. 群晖3617可以有几个网卡_Synology 群晖 DS1621+ 六盘位NAS 开箱拆解评测
  6. E+H电磁流量计你知道多少?
  7. 高级测试开发工程师简历模板
  8. awk 在指定字符后面插入新字符
  9. [转载]安徽会考语文篇目(2)
  10. 笔记本重置找不到恢复环境_Win10重置找不到恢复环境需要安装介质的修复图文教程...
  11. 服务器主板能配固态硬盘吗,旧主板洗洗还能用、Z490主板搭配PCIe4.0固态硬盘 测试...
  12. Python 黑马程序员 笔记
  13. Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知
  14. Ruby on Rails,创建和执行migrations迁移文件
  15. 计算机主机显卡安装,安装后如何在计算机中启用独立显卡
  16. Hello Riak
  17. php打印99乘法表加粗,PHP基础循环语句之打印99乘法表
  18. [翻译] 神经网络与深度学习 第三章 提升神经网络学习的效果 - Chapter 3 Improving the way neural networks learn
  19. 配置文件的rc的由来
  20. 【教程】解决Windows下kiftd无法访问的问题(Windows防火墙设置)

热门文章

  1. 使用卷积神经网络识别交通标志
  2. 一份C++学习资源整理,咬牙切齿地好用。
  3. 华为鸿蒙备胎转正,华为鸿蒙是备胎系统,但已经实现上网随时能转正?
  4. 任务执行者EventLoop
  5. set 数据类型的应用场景
  6. 新增房源服务实现之AutoGenerator使用以及创建pojo对象
  7. 变量的引用-函数返回值传递引用
  8. 为元素绑定多个相同事件 绑定事件的另一种方式 复习 介绍 元素的事件绑定
  9. linux x86板级文件,Linux driver 板级文件跟踪一般方法
  10. RabbitMq链接