B-xor_2019牛客暑期多校训练营(第四场)
2024-09-22 23:52:44
题意
给出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;
}
最新文章
- 7.openstack之mitaka搭建dashboard
- python pickle 序列化类
- C语言与套接字
- PHP的几个常用加密函数
- XMPP框架下微信项目总结(7)聊天通信处理-发送,接受数据
- ZT 趋势移动安全apk
- paip.提升性能----硬盘不同转速不同缓存对比转
- git流程及操作
- Assembly文件被锁定
- 通过Messenger与后台连接(单向操作,activity向service发送数据)
- ios字符串操作
- 利用抽象、多态实现无反射的绿色环保ORM框架
- 【原创】POJ 1703 &;&; RQNOJ 能量项链解题报告
- Tomcat剖析(二):一个简单的Servlet服务器
- 测试指南(适用于Feature/promotion/bug)
- java反射机制,以及对反射机制的了解,如有差池欢迎点评(初学者勿喷)
- web类协议脚本-飞机订票系统示例
- VirtualBox如何扩展虚拟机Ubuntu的硬盘容量-转
- WGS84投影的WKID说明
- solc 编译Solidity
热门文章
- python中if __name__ == &#39;__main__&#39; :main(()
- 精准营销、批量提取QQ群成员号码
- Linux下Docker以及portainer相关配置
- AQS之CountDownLatch、Semaphore、CyclicBarrier
- IE浏览器主页被篡改为2345,针对一般解决办法无法解决的情况
- eclipse导入码云-GIT项目
- springboot整合websocket高级版
- todaytt
- ecshop 管理后台菜单及权限管理机制
- Ubuntu 17 安装Chrome浏览器