[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的 ...
随机推荐
- axure--中继器
*****中继器-repeater*****1.结构:类似于MVC(增删查改)1)中继器数据集:可包括图片.文字.网址(页面)(右键添加,列名尽量使用英 文或拼音) 2)中继器格式:横向.纵向(是否换 ...
- JavaScript 高级程序设计第二版
20.4 部署 20.4.1 构建 构建过程始于在源控制中定义用于存储文件的逻辑结构.最好避免使用一个文件存放所有的JavaScript,遵循以下面向对象语言中的典型模式:将每个对象或自定义了类别分别 ...
- 激活函数的比较,sigmoid,tanh,relu
1. 什么是激活函数 如下图,在神经元中,输入inputs通过加权.求和后,还被作用了一个函数.这个函数就是激活函数Activation Function 2. 为什么要用激活函数 如果不用激活函数, ...
- 使用python调用wps v9转换office文件到pdf
#!/usr/bin/python2.6 # -*- coding: utf-8 -*- # pip install timeout-decorator import os import win32c ...
- VS2015 将*.xaml.cs文件包裹在*.xaml文件下
原文:https://stackoverflow.com/questions/13387527/add-existing-xaml-files-to-visual-studio-2012 Right- ...
- exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
1.虽然,不是大错,还说要贴一下,由于我运行run-example streaming.NetworkWordCount localhost 9999的测试案例,出现的错误,第一感觉就是Spark没有 ...
- C#学习-构造函数
如果没有为类显式地定义一个构造函数,则C#编译器会自动生成一个函数体为空的默认无参的实例构造函数. 构造函数主要用于创建类的实例对象. 当调用构造函数创建一个对象时,构造函数会为对象分配内存空间,并初 ...
- 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 ...
- Multidex(二)之Dex预加载优化
Multidex(二)之Dex预加载优化 https://www.jianshu.com/p/2891599511ff
- bzoj3769 spoj 8549 BST again
题解: 比较水的题目 普通dp其实复杂度还是比较大的 可以任意模数ntt优化.. 但好像没人写.. 代码: #include <bits/stdc++.h> using namespace ...