[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. jmeter IP欺骗功能

    使用过loadrunner的同学,应该都了解有个IP欺骗功能,jmeter遇到类似需求怎样实现呢? 环境:windows7,jdk1.8,jmeter3.1 使用IP欺骗功能前提是本地有多个可用IP, ...

  2. vue自定义指令directives使用及生命周期

    生命周期 bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个绑定时执行一次的初始化动作. inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于docu ...

  3. urls.py路由系统分发的本质

    路由系统分发的本质 反向生成redirect跳转url 1.在urls.py中指定url的name from django.conf.urls import url from django.contr ...

  4. WCF 非http寄宿IIS

    摘要 从IIS 7 开始, IIS增加了对非HTTP协议的支持. 因此, 自IIS 7之后, 可以将NetTcpBinding等非HTTP协议的Bindings直接寄宿在IIS上面. 本文将介绍如何在 ...

  5. 一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)

    Storm的官方网址:http://storm.apache.org/index.html :集群部署的基本流程(基本套路): 集群部署的流程:下载安装包.解压安装包.修改配置文件.分发安装包.启动集 ...

  6. 利用 Windows API Code Pack 修改音乐的 ID3 信息

    朋友由于抠门 SD 卡买小了,结果音乐太多放不下,又不舍得再买新卡,不得已决定重新转码,把音乐码率压低一点,牺牲点音质来换空间(用某些人的话说,反正不是搞音乐的,听不出差别)… 结果千千静听(百度音乐 ...

  7. adb devices unauthorized解决办法

    进行Android项目调试时,连接完设备,进行adb install ******.apk时,偶遇 adb devices unauthorized 这个小东西,解决办法:将手机设置->辅助功能 ...

  8. IIS7部署报错 500.22错误 检查到这集成托管模式下不使用的ASP.NET配置

    公司的一个项目,环境为: .Net 4.0 + MVC3,部署在Windows Server 2003R2 IIS6.0上面运行正常, 迁移到新服务器Windows Server 2008R2,部署在 ...

  9. c# 调apicontroller

    public string Post(ModelCs mod) { string formData = Newtonsoft.Json.JsonConvert.SerializeObject(mod) ...

  10. Trident继承kafka

    1.Kafka涉及的类 上一个类是不透明事务 后一个是完全事务 2.启动服务 3..驱动类 重要的地方是修改了两个部分: 1.数据的来源是kafka 2.第二个是字段的Fields是str packa ...