「CF242E」XOR on Segment 解题报告
题面
长度为\(n\)的数列,现有两种操作:
1、区间异或操作
2、区间求和操作
对于每个查询,输出答案
思路:
线段树+二进制拆位
线段树区间修改一般使用的都是懒标记的方法,但是对于异或,懒标记的方法显然是行不通的,于是就考虑二进制拆位
主要的思路就是将一个数,拆成若干个二进制位,然后对于异或操作,就转换成了每一位上的异或操作
分类讨论一下:
1、当\(x\)的第\(i\)位为\(1\)时,\(1\ xor\ 0=1\),\(1\ xor\ 1=0\)
也就是看成区间取反操作
2、当\(x\)的第\(i\)位为\(0\)时,\(0\ xor\ 0=0\),\(0\ xor\ 1=1\)
也就是说操作前后没有变化,所以就不执行修改操作
Code:
#include<bits/stdc++.h>
#define ll long long
#define N 100010
using namespace std;
int n,a[N],res,L,R,T,x;
int f[N<<2][25],tag[N<<2][25];//1e6<2^20
ll b[25],ans;//别忘记long long
int read(){ int s=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){s=(s<<1)+(s<<3)+c-'0';c=getchar();}
return s;
}
void built(int k,int l,int r)
{
if(l>r) return;
if(l==r)
{
res=a[l];
for(int i=0;i<21;i++)//拆位
if((res>>i)&1) f[k][i]=1;
return;
}
int mid=(l+r)>>1,cur=k<<1;
built(cur,l,mid);
built(cur|1,mid+1,r);
for(int i=0;i<21;i++)
f[k][i]=f[cur][i]+f[cur|1][i];
return;
}
void push(int k,int l,int r,int p)//p表示第几位
{
f[k][p]=(r-l+1)-f[k][p];//区间取反
if(l!=r)
{
int cur=k<<1;
tag[cur][p]^=1;
tag[cur|1][p]^=1;
}
tag[k][p]=0;
}
void Modify(int k,int l,int r,int p)//p同上
{
if(tag[k][p]) push(k,l,r,p);
if(r<L||R<l) return;
if(L<=l&&r<=R)
{
push(k,l,r,p);
return;
}
int mid=(l+r)>>1,cur=k<<1;
Modify(cur,l,mid,p);
Modify(cur|1,mid+1,r,p);
f[k][p]=f[cur][p]+f[cur|1][p];
}
void Query(int k,int l,int r)//查询,所有位的懒标记都要下放
{
for(int i=0;i<21;i++)
if(tag[k][i]) push(k,l,r,i);
if(r<L||R<l) return;
if(L<=l&&r<=R)
{
for(int i=0;i<21;i++) ans+=f[k][i]*b[i];
return;
}
int mid=(l+r)>>1,cur=k<<1;
Query(cur,l,mid);
Query(cur|1,mid+1,r);
}
int main()
{
int i,j;b[0]=1;
for(i=1;i<=21;i++) b[i]=b[i-1]<<1;//初不初始化都可以,就是上面b[i]要变成1<<i
n=read();
for(i=1;i<=n;i++) a[i]=read();
built(1,1,n);
T=read();
while(T--)
{
if(read()==1)
{
L=read();R=read();ans=0;
Query(1,1,n);
printf("%lld\n",ans);
}
else
{
L=read();R=read();x=read();
for(i=0;i<21;i++)//判断x的第i位是不是1,并进行修改
if((x>>i)&1) Modify(1,1,n,i);
}
}
return 0;
}
「CF242E」XOR on Segment 解题报告的更多相关文章
- 洛谷 P4714 「数学」约数个数和 解题报告
P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...
- 「NOI2013」树的计数 解题报告
「NOI2013」树的计数 这什么神题 考虑对bfs重新编号为1,2,3...n,然后重新搞一下dfs序 设dfs序为\(dfn_i\),dfs序第\(i\)位对应的节点为\(pos_i\) 一个暴力 ...
- 「NOI2016」优秀的拆分 解题报告
「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...
- 「NOI2016」循环之美 解题报告
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...
- 「FJOI2018」领导集团问题 解题报告
「FJOI2018」领导集团问题 题意:给你一颗\(n\)个点的带点权有根树,选择一个点集\(S\),使得点集中所有祖先的点权$\le \(子孙的点权,最大化\)|S|$(出题人语死早...) 一个显 ...
- 「SP25784」BUBBLESORT - Bubble Sort 解题报告
SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...
- 「SP122」STEVE - Voracious Steve 解题报告
SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...
- 「Luogu」[JSOI2007]字符加密 解题报告
题面 思路: 作为一个后缀数组的初学者,当然首先想到的是后缀数组 把\(s\)这个串首尾相接,扩展为原来的两倍,就能按后缀数组的方法处理 证明: 神仙一眼就看出这是后缀的裸题,我这个蒟蒻想了半天想不出 ...
- 「P5004」专心OI - 跳房子 解题报告
题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...
随机推荐
- php 正则表达式怎么匹配标签里面的style?
$str = '<div style="margin:0px;text-align:left;padding:0px;">任意内容</div>'; $reg ...
- AtCoder Regular Contest 058
这个应该是第一场有英文的atcoder吧??不过题解却没有英文的... 从前往后慢慢做... C こだわり者いろはちゃん / Iroha's Obsession 数据范围这么小,直接暴力 #inclu ...
- 测试代码的执行时间魔法方法%time和%timeit
对于规模更大.运行时间更长的数据分析应用程序,你可能会希望测试一下各个部分或函数调用或语句的执行时间.你可能会希望了解某个复杂计算过程中到底是哪些函数占用的时间最多.幸运的是,在开发和测试代码的过程中 ...
- SuperSocket 服务器管理器 (ServerManager)
SuperSocket服务器管理器文档 客户端安全证书验证 在 TLS/SSL 安全通信中, 客户端的安全证书不是必需的, 但是有些系统需要更高级别的安全保障. 因此有些用户提出了在服务器端验证客户端 ...
- H3C 帧中继基本配置命令(续)
- 版本号/缓存刷新 laravel mix函数
很多开发者会给编译的前端资源添加时间戳或者唯一令牌后缀以强制浏览器加载最新版本而不是代码的缓存副本.Mix 可以使用 version 方法为你处理这种场景. version 方法会自动附加唯一哈希到已 ...
- 央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家
央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家 ——已接入NFCS的P2P网贷机构将优先 接入央行征信系统 P2P网贷行业的健康发展依赖于信用体系的支撑和保障,加快完善适应 ...
- [转]Win10下安装Linux子系统
工作以来一直DotNet系偏C/S, 接触Web开发的时间也不长, 现在主要偏向Web全栈方向, 一直对Linux系统心生向往, 夜深了娃睡了, 打开老旧的笔记本来折腾一下. 准备工作 控制面板 &g ...
- es6 let和const的用法
]()) {; } //console.log(MAX);//MAX is not defined" /*也有暂时性死区,声明的位置需要在使用前面,否则报错: * 不能重复声明变量 * */ ...
- P1019 聪聪理扑克
题目描述 聪聪的两个小伙伴灵灵和豪豪喜欢打扑克,什么斗地主.德州.牛牛,他们都玩的有模有样. 但是每次玩好扑克他们都不整理一下,所以整理扑克的任务就交到了聪聪的手上. 已知现在桌面上有 n 张扑克牌, ...