[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的 ...
随机推荐
- eclipse检出SVN项目的正确步骤
一.在工作空间新建工作目录:workspace-xf 二.在工作目录下workspace-xf 新建文件夹 tdvs ,进入该文件夹鼠标右键:SVN CheckOut 检出需要的项目 三.打开ecl ...
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 注意情况: 该案例使用的spring-boot版本1.5.x,没使用2.0.x, 另外本文图3 ...
- NodeJs——router报错原因
rout.js var http = require('http'); var url = require('url'); var router = require('./models/router. ...
- Senparc.Weixin微信开发(3) 自定义菜单与获取用户组
自定义菜单 代码参考:http://www.cnblogs.com/szw/p/3750517.html 还可以使用他们官网的自定义:https://neuchar.senparc.com/User/ ...
- webpack学习笔记--配置总结
从前面的配置看来选项很多,Webpack 内置了很多功能. 你不必都记住它们,只需要大概明白 Webpack 原理和核心概念去判断选项大致属于哪个大模块下,再去查详细的使用文档. 通常你可用如下经验去 ...
- [转] Mongoose 参考手册
Mongoose 参考手册 标签(空格分隔): MongoDB Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据 ...
- JSP中out.print()、out.println()以及out.write()的区别
out是JSP九大内置对象之一,是JspWriter的一个对象,JspWriter继承了java.io.Writer类. out.print()和out.write() print()和println ...
- 【转】如何向Android模拟器打电话发短信
转载地址:http://hi.baidu.com/jeremylai/item/420f9c9fe4881fccb62531f7 1. 启动Android Emulator, 查看标题栏找出端口.一般 ...
- Python_dict部分功能介绍
字典是无序的 x.clear():清除所有元素 x.fromkeys():返回一个新的字典,使前面的key=value x.get():如果k不存在,默认返回一个值,如果存在,则返回存在的值 x.it ...
- Codeforces 1017F The Neutral Zone 数论
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1017F.html 题目传送门 - CF1017F 题意 假设一个数 $x$ 分解质因数后得到结果 $x=p ...