2021牛客多校3 - Kuriyama Mirai and Exclusive Or(差分+倍增)
题目链接:点击查看
题目大意:给出一个长度为 nnn 的序列,现在需要执行 mmm 次操作,每次操作分为下列两种类型:
- 0 l r x:区间 [l,r][l,r][l,r] 内的数都异或上 xxx
- 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(差分+倍增)相关推荐
- LCS(2021牛客多校4)
LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...
- 【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 ...
- 2021牛客暑期多校训练营3 I Kuriyama Mirai and Exclusive Or 差分 + 二进制分治
传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,让你实现以下两个操作之后输出数组aaa. n≤6e5,ai≤230−1n\le6e5,a_i\le2^{30}-1n≤6e5,ai≤23 ...
- K-Stack 2021牛客多校2
链接:https://ac.nowcoder.com/acm/contest/11253/K 来源:牛客网 题目描述 ZYT had a magic permutation a1,a2,⋯ ,an a ...
- 2021牛客多校第八场补题 D-OR
链接:https://ac.nowcoder.com/acm/contest/11259/D 来源:牛客网 题目描述 There are two sequences of length n−1n-1n ...
- 2021牛客多校第五场补题
B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n boxes in front o ...
- 2021牛客多校9 - Cells(推公式+NTT)
题目链接:点击查看 题目大意:初始时给出 nnn 个点,分别为 {(0,a0),(0,a1),⋯,(0,an)}\{(0,a_0),(0,a_1),\cdots,(0,a_n)\}{(0,a0),( ...
- (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 ...
- 【多校训练】2021牛客多校5
[前言] 很久没有时间整理题解了,补题和打游戏的时间居多(doge) 这场其实主要F出题人数据有锅,花太多时间了(赛后重测是一血),然后后面G想歪了爆搜剪枝没过,I的回滚莫队队友前一天写了结果今天写不 ...
最新文章
- hdu-2553 N皇后问题(深搜 + 状态压缩)
- SpringMVC-方法四种类型返回值总结,你用过几种?
- 【报告分享】2021年品牌CDP与营销数字化转型报告.pdf(附下载链接)
- 云锵基金 2019 年 02 月简报
- 群晖3617可以有几个网卡_Synology 群晖 DS1621+ 六盘位NAS 开箱拆解评测
- E+H电磁流量计你知道多少?
- 高级测试开发工程师简历模板
- awk 在指定字符后面插入新字符
- [转载]安徽会考语文篇目(2)
- 笔记本重置找不到恢复环境_Win10重置找不到恢复环境需要安装介质的修复图文教程...
- 服务器主板能配固态硬盘吗,旧主板洗洗还能用、Z490主板搭配PCIe4.0固态硬盘 测试...
- Python 黑马程序员 笔记
- Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知
- Ruby on Rails,创建和执行migrations迁移文件
- 计算机主机显卡安装,安装后如何在计算机中启用独立显卡
- Hello Riak
- php打印99乘法表加粗,PHP基础循环语句之打印99乘法表
- [翻译] 神经网络与深度学习 第三章 提升神经网络学习的效果 - Chapter 3 Improving the way neural networks learn
- 配置文件的rc的由来
- 【教程】解决Windows下kiftd无法访问的问题(Windows防火墙设置)