[CC-MINXOR]XOR Minimization
[CC-MINXOR]XOR Minimization
题目大意:
有一个长度为\(n\)的数列\(A_{1\sim n}\)。\(q\)次操作,操作包含以下两种:
- 询问\(A_{l\sim r}\)中最小值及其出现次数;
- 将\(A_{l\sim r}\)中每个数字异或上\(k\)。
\(n\le250,000;q\le50,000;0\le A_i,k<2^{16}\)
思路:
分块+字典树
源代码:
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=250000,B=500,K=1<<16;
int n,a[N],tag[B],bel[N],beg[B],end[B];
struct Node {
int val,cnt;
};
class Trie {
private:
int val[K<<1];
public:
void reset() {
memset(val,0,sizeof val);
}
void insert(const int &x) {
for(register int i=15,p=1;i>=0;i--) {
p=p<<1|((x>>i)&1);
val[p]++;
}
}
Node query(const int &x) const {
int p=1,ret=0;
for(register int i=15;i>=0;i--) {
p<<=1;
if(val[p|((x>>i)&1)]) {
p|=(x>>i)&1;
} else {
ret|=1<<i;
p|=((x>>i)&1)^1;
}
}
return (Node){ret,val[p]};
}
};
Trie t[B];
inline void rebuild(const int &k) {
t[k].reset();
for(register int i=beg[k];i<=end[k];i++) {
t[k].insert(a[i]);
}
}
inline void modify(const int &l,const int &r,const int &k) {
if(bel[l]==bel[r]) {
for(register int i=beg[bel[l]];i<=end[bel[l]];i++) {
a[i]^=tag[bel[l]];
}
tag[bel[l]]=0;
for(register int i=l;i<=r;i++) {
a[i]^=k;
}
rebuild(bel[l]);
return;
}
for(register int i=beg[bel[l]];i<=end[bel[l]];i++) {
a[i]^=tag[bel[l]];
}
tag[bel[l]]=0;
for(register int i=l;i<=end[bel[l]];i++) {
a[i]^=k;
}
rebuild(bel[l]);
for(register int i=bel[l]+1;i<bel[r];i++) {
tag[i]^=k;
}
for(register int i=beg[bel[r]];i<=end[bel[r]];i++) {
a[i]^=tag[bel[r]];
}
tag[bel[r]]=0;
for(register int i=beg[bel[r]];i<=r;i++) {
a[i]^=k;
}
rebuild(bel[r]);
}
inline Node query(const int &l,const int &r) {
Node ans=(Node){K,0};
if(bel[l]==bel[r]) {
for(register int i=l;i<=r;i++) {
if((a[i]^tag[bel[i]])<ans.val) {
ans=(Node){a[i]^tag[bel[i]],0};
}
if((a[i]^tag[bel[i]])==ans.val) {
ans.cnt++;
}
}
return ans;
}
for(register int i=l;i<=end[bel[l]];i++) {
if((a[i]^tag[bel[i]])<ans.val) {
ans=(Node){a[i]^tag[bel[i]],0};
}
if((a[i]^tag[bel[i]])==ans.val) {
ans.cnt++;
}
}
for(register int i=bel[l]+1;i<bel[r];i++) {
const Node tmp=t[i].query(tag[i]);
if(tmp.val<ans.val) {
ans=(Node){tmp.val,0};
}
if(tmp.val==ans.val) {
ans.cnt+=tmp.cnt;
}
}
for(register int i=beg[bel[r]];i<=r;i++) {
if((a[i]^tag[bel[i]])<ans.val) {
ans=(Node){a[i]^tag[bel[i]],0};
}
if((a[i]^tag[bel[i]])==ans.val) {
ans.cnt++;
}
}
return ans;
}
int main() {
n=getint();
const int q=getint(),block=sqrt(n);
for(register int i=0;i<n;i++) {
bel[i]=i/block;
a[i]=getint();
t[bel[i]].insert(a[i]);
if(i&&bel[i]!=bel[i-1]) {
beg[bel[i]]=i;
}
end[bel[i]]=i;
}
for(register int i=0;i<q;i++) {
const int opt=getint(),l=getint()-1,r=getint()-1;
if(opt==1) {
const Node ans=query(l,r);
printf("%d %d\n",ans.val,ans.cnt);
}
if(opt==2) {
modify(l,r,getint());
}
}
return 0;
}
[CC-MINXOR]XOR Minimization的更多相关文章
- scau 2015寒假训练
并不是很正规的.每个人自愿参与自愿退出,马哥找题(马哥超nice么么哒). 放假第一周与放假结束前一周 2015-01-26 http://acm.hust.edu.cn/vjudge/contest ...
- CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries
https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...
- BZOJ2115 [Wc2011] Xor
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
- bestcoder r44 p3 hdu 5270 ZYB loves Xor II
这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR 然后就想了想昨晚的思路 发现可做 ...
- BZOJ 4269: 再见Xor [高斯消元 线性基]
4269: 再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 我太愚蠢了连数组开小了以及$2^{ ...
- BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]
啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有 ...
- D. Kuro and GCD and XOR and SUM
Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...
- cf1088D Ehab and another another xor problem (构造)
题意:有两数a,b,每次你可以给定c,d询问a xor c和b xor d的大小关系,最多询问62次($a,b<=2^{30}$),问a和b 考虑从高位往低位做,正在做第i位,已经知道了a和b的 ...
- 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)
To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...
随机推荐
- 深入理解 Vue Computed 计算属性
Computed 计算属性是 Vue 中常用的一个功能,我们今天来说一下他的执行过长 拿官网简单的例子来看一下: <div id="example"> <p> ...
- 关于使用easyui为前端框架,加载表格数据较多时在火狐浏览器会出现表格片段不停闪烁问题的兼容问题解决。
1.项目是可视化管理系统,加载的数据较多,使用谷歌浏览器从登陆界面跳转到主页时还算干净利落,但是使用火狐浏览器时在这一过程中在数据没有加载完毕之前,整个页面就仿佛是在闪烁,可以看到闪烁的是表格字段的片 ...
- Java接口自动化测试之HTTPClient学习(四)
pom.xml 文件中dependency <dependencies> <dependency> <groupId>org.testng</groupId ...
- 构建简单的json树形菜单
json结构: var Menu = [{ tit:"一级菜单", submenu:[{ tit:"二级菜单", url:"", func: ...
- nginx 域名泛解析
部分应用场景下要求服务器根据客户输入的二级域名地址自动访问不同的页面,比如一个服务器放置了不同的业务,商城.官网等多个业务,又不想一个个配置server, 网站目录结构入戏: html 网站根目录 m ...
- python全栈开发day68-ORM操作:一般操作、ForeignKey操作、ManyToManyField、聚合查询和分组查询、F查询和Q查询等
ORM操作 https://www.cnblogs.com/maple-shaw/articles/9403501.html 一.一般操作 1. 必知必会13条 <1> all(): 查询 ...
- HDU5117 Fluorescent 期望 计数 状压dp 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/HDU5117.html 题目传送门 - HDU5117 题意 $T$ 组数据. 给你 $n$ 盏灯 ,$m$ 个 ...
- JVM笔记(虚拟机各内存的介绍)
JVM笔记 java代码执行分为两部分:javac编译 java执行 代码并不是由上往下执行的,会经过编译期重排序进行优化,存在依赖关系的代码不会被重排序,保证了代码最终执行结果的正确性! j ...
- tensorflow基础架构 - 处理结构+创建一个线性回归模型+session+Variable+Placeholder
以下仅为自己的整理记录,绝大部分参考来源:莫烦Python,建议去看原博客 一.处理结构 因为TensorFlow是采用数据流图(data flow graphs)来计算, 所以首先我们得创建一个数据 ...
- day14,函数的使用方法:生成器表达式,生成器函数
生成器表达式: #列表推导式 # y = [1,2,3,4,5,6,7,8] # x = [1,4,9,16,25,36,49,64] # x = [] # for i in y: # x.appen ...