题意

给出n个数组(每组数个数不定),m个询问 l, r, x

序号在区间\([l,r]\)的每个数组是否都可以取出任意个数异或出x

题解

判断一个数组能否异或出x,是简单的线性基问题

判断多个线性基能否异或出x只需求出这些线性基的交,在交线性基上判断能否异或出x,多个线性基的交一定能被每个线性基分别表示,利用线段树维护区间线性基交就行,线性基求交模板是牛客上扒的咖啡鸡的

代码

#include <bits/stdc++.h>

using namespace std;
const int mx = 50000+10;
typedef unsigned int ui; ui a[mx][35]; struct node{
ui r[32];
ui f[32];
bool ins(ui x){
for (int i=31;i>=0;i--)
if (x>>i){
if (!r[i]) {r[i]=x;return 1;}
x^=r[i];
if (!x) return 0;
}
return 0;
}
void ins2(ui x){
ui tmp=x;
for (int i=31;i>=0;i--)
if (x>>i){
if (!r[i]) {f[i]=tmp;r[i]=x;return;}
x^=r[i]; tmp^=f[i];
if (!x) return;
}
return;
}
bool find(ui x){
for (int i=31;i>=0;i--)
if (x>>i){
if (!r[i]) return 0;
x^=r[i];
}
return x==0;
}
ui calc(ui x){
ui ret=0;
for (int i=31;i>=0;i--){
if (x>>i){
ret^=f[i];
x^=r[i];
}
}
return ret;
}
void print(){
for (int i=0;i<3;i++)cout<<r[i]<<' ';cout<<endl;
}
void clear(){
for (int i=0;i<32;i++) r[i]=f[i]=0;
}
}tree[mx<<2]; node merge(node u,node v){
node ret,tmp;
ret.clear(); tmp=u;
for (int i=31;i>=0;i--) {
ui x=v.r[i];
if (tmp.find(x)){
ret.ins(x^tmp.calc(x));
} else tmp.ins2(x);
}
return ret;
} void pushUp(int rt) {
tree[rt] = merge(tree[rt<<1], tree[rt<<1|1]);
} void build(int l, int r, int rt) {
if (l == r) {
for (int i = 1; i <= 32; i++)
tree[rt].ins(a[r][i]);
return;
}
int mid = (l + r) / 2;
build(l, mid, rt<<1);
build(mid+1, r, rt<<1|1);
pushUp(rt);
} bool query(int L, int R, ui x, int l, int r, int rt) {
if (L <= l && r <= R) {
return tree[rt].find(x);
}
int mid = (l + r) / 2;
bool f1 = true, f2 = true;
if (L <= mid) f1 = query(L, R, x, l, mid, rt<<1);
if (mid < R) f2 = query(L, R, x, mid+1, r, rt<<1|1);
return f1&&f2;
} int main() {
int n, m, sz;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &sz);
for (int j = 1; j <= sz; j++)
scanf("%u", &a[i][j]);
}
build(1, n, 1);
while (m--) {
ui l, r, x;
scanf("%u%u%u", &l, &r, &x);
puts(query(l, r, x, 1, n, 1) ? "YES" : "NO");
}
return 0;
}

最新文章

  1. 7.openstack之mitaka搭建dashboard
  2. python pickle 序列化类
  3. C语言与套接字
  4. PHP的几个常用加密函数
  5. XMPP框架下微信项目总结(7)聊天通信处理-发送,接受数据
  6. ZT 趋势移动安全apk
  7. paip.提升性能----硬盘不同转速不同缓存对比转
  8. git流程及操作
  9. Assembly文件被锁定
  10. 通过Messenger与后台连接(单向操作,activity向service发送数据)
  11. ios字符串操作
  12. 利用抽象、多态实现无反射的绿色环保ORM框架
  13. 【原创】POJ 1703 &amp;&amp; RQNOJ 能量项链解题报告
  14. Tomcat剖析(二):一个简单的Servlet服务器
  15. 测试指南(适用于Feature/promotion/bug)
  16. java反射机制,以及对反射机制的了解,如有差池欢迎点评(初学者勿喷)
  17. web类协议脚本-飞机订票系统示例
  18. VirtualBox如何扩展虚拟机Ubuntu的硬盘容量-转
  19. WGS84投影的WKID说明
  20. solc 编译Solidity

热门文章

  1. python中if __name__ == &#39;__main__&#39; :main(()
  2. 精准营销、批量提取QQ群成员号码
  3. Linux下Docker以及portainer相关配置
  4. AQS之CountDownLatch、Semaphore、CyclicBarrier
  5. IE浏览器主页被篡改为2345,针对一般解决办法无法解决的情况
  6. eclipse导入码云-GIT项目
  7. springboot整合websocket高级版
  8. todaytt
  9. ecshop 管理后台菜单及权限管理机制
  10. Ubuntu 17 安装Chrome浏览器