闲话

有这样一个问题——一个长度为\(n\)的序列\(a_1-a_n\),\(q\)个询问,每次询问\(l,r\),选出\(\{a_l,a_{l+1}...a_{r}\}\)中一个子集使得子集内元素异或和最大/小。

第一次出现在HNOI模拟赛,当时的\(n,q\)只有大概\(3*10^4\)还是\(10^5\)的样子。然后毫不犹豫的写了个\(n\log^3n+q\log^2n\)的线性基ST表过了。。。

第二次出现在NOI模拟赛,数据范围大到了\(10^6\)!!!因为上一次IOI金牌爷laofu踩了标算。。。然后发现自己上次没听懂,只会写个两个\(\log\)的分治。

第三次出现在NOI.AC的NOIP lus模拟赛,然后发现自己还是没听懂。。。。。。

题目

NOIAC41 最短路

是个巧(wu)妙(chi)的二合一,另一部分的思路来自洛谷P4151 [WC2011]最大XOR和路径

注意到线性基的一些特性:当向其中插入若干个位长为\(k\)的整数后,实际上真正插入到其中的只有\(k\)个数。也就是说,对于一个区间\([l,r]\),当我们从\(r\)到\(l\)依次尝试插入数的过程中,最多会产生\(k\)个本质不同的线性基,而且这些数在线性基内的插入行两两不同。

我们离线处理,对于右端点都在\(r\)的询问区间一起考虑。我们已知\([1,r]\)的线性基每一行被插入的数在原序列中的位置(从\(r\)到\(l\)插入)。对于一个询问,我们取出线性基中所有被插入位置\(\ge l\)的行来更新答案。

那么如何快速从\([1,r-1]\)的线性基变到\([1,r]\)呢?毫无疑问我们这时会先插入\(a_r\),设它插入到了第\(j\)行。那么原来在第\(j\)行的数现在就不会留在这里了,会\(xor\ a_r\)后继续尝试着插入下面的行。操作过程就是:把原来的数取出来,插入当前数,继续把后面原来的数取出来。。。如是循环。

总的复杂度变成了\((n+q)k\),十分优秀。

#include<bits/stdc++.h>
#define RG register
#define R RG int
#define G if(++ip==iend)fread(ip=buf,1,N,stdin)
using namespace std;
const int N=3e5+9,M=6e5+9;
char buf[N],*iend=buf+N,*ip=iend-1;
int he[N],ne[M],to[M],w[M],s[N],a[N],b[N],l[N],lb[39],at[39];
bool vis[N];
inline int in(){G;while(*ip<'-')G;R x=*ip&15;G;while(*ip>'-'){x*=10;x+=*ip&15;G;}return x;
}
inline void chkmn(R&x,R y){if(x>y)x=y;
}
void dfs(R x){vis[x]=1;for(R y,i=he[x];i;i=ne[i])if(!vis[y=to[i]])s[y]=s[x]^w[i],dfs(y);
}
int main(){R n=in(),m=in(),q=in(),p=0,i,r,x,y;for(i=1;i<n;++i){x=in();y=in();ne[++p]=he[x];to[he[x]=p]=y;ne[++p]=he[y];to[he[y]=p]=x;w[p]=w[p-1]=in();}dfs(1);for(i=1;i<=m;++i)a[i]=s[in()]^s[in()]^in();memset(he+1,0,n<<2);for(i=1;i<=q;++i){b[i]=s[in()]^s[in()];l[i]=in();ne[i]=he[r=in()];he[r]=i;}for(r=1;r<=m;++r){x=a[r];p=r;for(i=30;~i;--i)//更新线性基if(1<<i&x){if(!lb[i]){lb[i]=x;at[i]=p;break;}if(at[i]<p)swap(lb[i],x),swap(at[i],p);x^=lb[i];}for(x=he[r];x;x=ne[x])//求答案for(i=30;~i;--i)if(at[i]>=l[x])chkmn(b[x],b[x]^lb[i]);}for(i=1;i<=q;++i)printf("%d\n",b[i]);return 0;
}

转载于:https://www.cnblogs.com/flashhu/p/9670045.html

区间子集最大/最小异或和问题(线性基,树上差分)相关推荐

  1. Loj#114-k大异或和【线性基】

    正题 题目链接:https://loj.ac/problem/114 题目大意 nnn个数,求所有非空子集的kkk小异或和. 解题思路 我们考虑处理一下线性基,我们知道对于did_idi​是一定在第i ...

  2. Codeforces Round #532 (Div. 2) F. Ivan and Burgers(可持久化异或线性基+双指针)

    题意 给n个数,q组询问,每次询问l到r的最大异或和 思路来源 某cf奆神代码 题解 本来应该是线性基上分治的 这里一发基数+贪心也能过 真是神仙代码啊 双指针的经典应用: 对于每个询问[l,r],r ...

  3. 【HDU3949 + BZOJ2115 + CF724G】【异或线性基例题】| 倍增 | 第k小异或和 | DFS处理环 |【CGWR】| N

    三道关于异或线性基的有趣的题目 [1] HDU 3949. XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3276 ...

  4. 【CodeForces 1100F】异或线性基 | 贪心 | 离线区间最大异或和 | E

    补题ing- 真的不应该错过这场比赛的 qwq 1100F. Ivan and Burgers time limit per test: 3 seconds memory limit per test ...

  5. 『线性空间 整数线性基和异或线性基』

    线性空间 定义 线性空间是一个关于一下两个运算封闭的向量集合: \(1.\)向量加法\(a+b\),其中\(a,b\)为向量 \(2.\)标量乘法\(k*a\),其中\(a\)为向量,\(k\)为常数 ...

  6. 【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】

    传送门 题意:定义两个图的异或的边集为在两张图中恰出现一次的边.给sss张nnn个点的图的集合,求异或和为连通图的子集数. s≤60,n≤10s \leq 60,n \leq 10s≤60,n≤10 ...

  7. Codeforces 1336E Chiori and Doll Picking (子集和变换、线性基、阈值算法、状压 DP、组合计数)...

    题目链接 https://codeforces.com/contest/1336/problem/E 题解 假设线性基大小是 \(L\),其异或值域记作 \(S\),则对于异或值域内每个数,显然有 \ ...

  8. CF938G Shortest Path Queries(线性基/线段树分治/异或)

    CF938G Shortest Path Queries 支持加边删边和查询两点之间的异或最短路,我们可以使用线段树分治,然后利用线性基求解. 但是这里图可能不是联通的,所以查询两点之间的异或和需要边 ...

  9. P5169 xtq的异或和(FWT+线性基)

    传送门 我咋感觉我学啥都是白学-- 首先可以参考一下这一题,从中我们可以知道只要知道两点间任意一条路径以及整个图里所有环的线性基,就可以得知这两个点之间的所有路径的异或和 然而我好像并不会求线性基能张 ...

最新文章

  1. StringUtils工具类的常用方法
  2. UVa12467 Secret Word(kmp)
  3. 开的什么源?——第三篇:草根创业
  4. linux自动化安装oracle,ftp的客户端软件 Linux环境一键自动化安装oracle软件的构想(附she...
  5. android高德marker添加点击,高德地图上添加marker,给每一个marker添加点击事件。...
  6. 7-88 二叉搜索树的结构 (30 分)
  7. mysql数据库是下面哪种类型的数据库_SQL数据库 选择哪个类型的数据库?
  8. APIC ID 的通用七级解释与概念性六级拓扑:APICID
  9. 摄像头取景框_苹果11的「超取景框拍摄照片」,很多人都不知道怎么用
  10. automake连载--Linux下使用autoconfig automake进阶
  11. oracle的时间取的到底是谁的时间
  12. 以后所有经济时事的点评都不在这里
  13. python文本交换_有没有办法用python交换文本文件中的两行文本?
  14. 萤火虫小程序_漫展广州丨第24届酷狗蘑菇萤火虫漫展圆满收官,我们国庆见!...
  15. 自制CMSIS-DAP下载器
  16. mysql查看数据库表容量大小_详解MySQL查看数据库表容量大小的方法总结
  17. android路由器安装wifidog,Wifidog-刷OpenWRT标准版固件后安装LuCI的方法
  18. mac转换助理安装Windows11
  19. 嵌入式--LCD常用接口介绍
  20. 我的魅族开不了机了,一直卡在开机界面

热门文章

  1. 嵌入式系统工程化设计4
  2. jQuery 图像 360 度旋转插件
  3. python翻译程序-Python:谷歌翻译20次的程序如何实现?
  4. 梁朝伟变刘德华之山寨实现
  5. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第四章 使用SCAPY掌控网络(2)Scapy实现ARP缓存投毒
  6. 20220109训练-腿
  7. VSRX防火墙安装与部署
  8. 【acwing】游戏时间2理解
  9. python以只读方式打开文本文件的参数_open(test.txt, 'r+')是以只读模式打开test.txt文件_学小易找答案...
  10. IPD百科 | IPD产品管理体系中产品经理能力模型