[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的更多相关文章

  1. scau 2015寒假训练

    并不是很正规的.每个人自愿参与自愿退出,马哥找题(马哥超nice么么哒). 放假第一周与放假结束前一周 2015-01-26 http://acm.hust.edu.cn/vjudge/contest ...

  2. 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] 表示第 ...

  3. BZOJ2115 [Wc2011] Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  4. bestcoder r44 p3 hdu 5270 ZYB loves Xor II

    这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR  然后就想了想昨晚的思路 发现可做 ...

  5. BZOJ 4269: 再见Xor [高斯消元 线性基]

    4269: 再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 我太愚蠢了连数组开小了以及$2^{ ...

  6. BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]

    啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有 ...

  7. D. Kuro and GCD and XOR and SUM

    Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...

  8. 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的 ...

  9. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

随机推荐

  1. axure--中继器

    *****中继器-repeater*****1.结构:类似于MVC(增删查改)1)中继器数据集:可包括图片.文字.网址(页面)(右键添加,列名尽量使用英 文或拼音) 2)中继器格式:横向.纵向(是否换 ...

  2. JavaScript 高级程序设计第二版

    20.4 部署 20.4.1 构建 构建过程始于在源控制中定义用于存储文件的逻辑结构.最好避免使用一个文件存放所有的JavaScript,遵循以下面向对象语言中的典型模式:将每个对象或自定义了类别分别 ...

  3. 激活函数的比较,sigmoid,tanh,relu

    1. 什么是激活函数 如下图,在神经元中,输入inputs通过加权.求和后,还被作用了一个函数.这个函数就是激活函数Activation Function 2. 为什么要用激活函数 如果不用激活函数, ...

  4. 使用python调用wps v9转换office文件到pdf

    #!/usr/bin/python2.6 # -*- coding: utf-8 -*- # pip install timeout-decorator import os import win32c ...

  5. VS2015 将*.xaml.cs文件包裹在*.xaml文件下

    原文:https://stackoverflow.com/questions/13387527/add-existing-xaml-files-to-visual-studio-2012 Right- ...

  6. exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

    1.虽然,不是大错,还说要贴一下,由于我运行run-example streaming.NetworkWordCount localhost 9999的测试案例,出现的错误,第一感觉就是Spark没有 ...

  7. C#学习-构造函数

    如果没有为类显式地定义一个构造函数,则C#编译器会自动生成一个函数体为空的默认无参的实例构造函数. 构造函数主要用于创建类的实例对象. 当调用构造函数创建一个对象时,构造函数会为对象分配内存空间,并初 ...

  8. PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://xxxx.wsdl'

    libxml_disable_entity_loader(false); $client = new \SoapClient($wsdl); 完美解决办法加上 php的soap扩展是否安装  open ...

  9. Multidex(二)之Dex预加载优化

    Multidex(二)之Dex预加载优化 https://www.jianshu.com/p/2891599511ff

  10. bzoj3769 spoj 8549 BST again

    题解: 比较水的题目 普通dp其实复杂度还是比较大的 可以任意模数ntt优化.. 但好像没人写.. 代码: #include <bits/stdc++.h> using namespace ...