题意

给你 $n$ 个集合,每个集合中包含一些整数。我们说一个集合表示一个整数当且仅当存在一个子集其异或和等于这个整数。现在你需要回答 $m$ 次询问 ($l, r, x$),是否 $l$ 到 $r$ 的每个集合都能表示 $x$.

分析

先求出每个集合的线性基,然后用线段树维护线性基的交,详见代码

#include<bits/stdc++.h>
#define reg register
using namespace std;
typedef long long ll; const int bits = ;
const int maxn = + ;
int n, q;
ll a[maxn][]; struct LBase {
//const static int bits = 31; //0~31位
ll d[bits+], tmp[bits+]; //线性基
bool flag = false; //记录是否cnt < n
LBase() {memset(d, , sizeof d);}
void insert(ll x)
{
for(int i=bits;~i;i--)
if(x&(1ll<<i))
{
if(!d[i]){ d[i]=x; break;}
else x ^= d[i];
}
flag = true;
}
bool check(ll x) //返回true表示已经能被表示
{
for(int i=bits;~i;i--)
if(x&(1ll<<i))
{
if(!d[i]) return false;
else x ^= d[i];
}
return true;
}
ll qmax(ll res=)
{
for(int i=bits;~i;i--)
res=max(res,res^d[i]);
return res;
}
ll qmin()
{
if(flag) return ;
for(int i=;i<=bits;i++)
if(d[i]) return d[i];
}
ll query(ll k) //查询第k小
{
ll res=; int cnt=;
k-=flag; if(!k)return ;
for(int i=;i<=bits;i++){
for(int j=i-;~j;j--)
if(d[i]&(1ll<<j)) d[i]^=d[j];
if(d[i]) tmp[cnt++]=d[i];
}
if(k>=(1ll<<cnt))return -;
for(int i=;i<cnt;i++)
if(k&(1ll<<i)) res^=tmp[i];
return res;
}
void merge(const LBase &a) { //求并集
for (int i = bits; i >= ; --i)
if (a.d[i]) insert(a.d[i]);
}
}; LBase intersection(const LBase &a,const LBase &b) //求交集
{
LBase ans, c=b,d=b;
for(int i = ;i <= bits;i++)
{
ll x =a.d[i];
if(!x) continue;
int j=i;ll T=;
for(;j>=;--j)
if((x>>j)&)
if(c.d[j]){x^=c.d[j];T^=d.d[j];}
else break;
if(!x)ans.d[i]=T;
else {c.d[j]=x;d.d[j]=T;}
}
return ans;
} struct SegTree
{
LBase b[maxn << ];
void build(int o, int L, int R)
{
int M = L + (R-L) / ;
if(L == R)
{
for(int i = ;i < ;i++) b[o].insert(a[L][i]);
}
else
{
build(*o, L, M);
build(*o+, M+, R);
//b[o].merge(b[2*o]); b[o].merge(b[2*o+1]);
b[o] = intersection(b[*o], b[*o+]);
}
} //查询[ql, qr]中是否都能表示出x
bool query(int o,int L,int R, int ql, int qr, ll x)
{
int M = L + (R - L) / ;
bool flag1 = true, flag2 = true;
if(ql <= L && R <= qr) return b[o].check(x);
if(ql <= M) flag1 = query(*o, L, M, ql, qr, x);
if(qr > M) flag2 = query(*o+, M+, R, ql, qr, x);
return flag1 && flag2;
} }seg; int main(){
scanf("%d%d", &n, &q);
for(int i = ;i <= n;i++)
{
int sz; scanf("%d", &sz);
for(int j = ;j < sz;j++) scanf("%lld", &a[i][j]);
for(int j=sz; j < ;j++) a[i][j] = ;
}
seg.build(, , n);
while(q--)
{
int l, r; ll x;
scanf("%d%d%lld", &l, &r, &x);
if(seg.query(, , n, l, r, x)) printf("YES\n");
else printf("NO\n");
}
return ;
}

2019牛客多校第四场B xor——线段树&&线性基的交的更多相关文章

  1. 2019牛客多校第四场B xor(线性基求交)题解

    题意: 传送门 给\(n\)个集合,每个集合有一些数.给出\(m\)个询问,再给出\(l\)和\(r\)和一个数\(v\),问你任意的\(i \in[l,r]\)的集合,能不能找出子集异或为\(v\) ...

  2. 2019牛客多校第七场C-Governing sand(线段树+枚举)

    Governing sand 题目传送门 解题思路 枚举每一种高度作为最大高度,则需要的最小花费的钱是:砍掉所有比这个高度高的树的所有花费+砍掉比这个高度低的树里最便宜的m棵树的花费,m为高度低的里面 ...

  3. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  4. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  5. 2019牛客多校第四场J free——分层图&&最短路

    题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...

  6. 2019牛客多校第四场A meeting——树的直径

    题意: 一颗 $n$ 个节点的树上标有 $k$ 个点,找一点使得到 $k$ 个关键结点的最大距离最小. 分析: 问题等价于求树的直径,最小距离即为直径除2向上取整. 有两种求法,一是动态规划,对于每个 ...

  7. [2019牛客多校第四场][G. Tree]

    题目链接:https://ac.nowcoder.com/acm/contest/884/G 题目大意:给定一个树\(A\),再给出\(t\)次询问,问\(A\)中有多少连通子图与树\(B_i\)同构 ...

  8. 2019牛客多校第四场D-triples I 贪心

    D-triples 题意 给你一个\(n\),问至少有几个数或运算起来可以等于\(n\),并且输出数量和这个几个数.题目说明给的\(n\)一定符合条件(不会输出\(n= 1\) 之类不存在情况). 思 ...

  9. 2019牛客多校第四场C-sequence(单调栈+线段树)

    sequence 题目传送门 解题思路 用单调栈求出每个a[i]作为最小值的最大范围.对于每个a[i],我们都要乘以一个以a[i]为区间内最小值的对应的b的区间和s,如果a[i] > 0,则s要 ...

随机推荐

  1. Linux 时间以及时间间隔的简单处理.

    最近想知道自己的一个部署脚本的耗时, 中午时间看了一下最简单的Linux 时间函数的处理 我这里的处理非常简单, 仅仅是够用而已. 处理过程. 1. 获取当前时间: time1=`date` 或者是 ...

  2. todo---ezmorph

    todo---ezmorph

  3. 人机交互技术 Week 1_人机交互概述

    HCI Week 1_Introduction 18-19学年春夏学期选修了计院万华根老师的人机交互技术课程,老师由于知识产权相关原因不能提供课件,故尽可能对课程内容做详尽的课堂笔记以供复习,如有不妥 ...

  4. LC 98. Validate Binary Search Tree

    题目描述 Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defin ...

  5. STM32中断应用总结

    STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生中断,其中中断和异常是等价的. 中断执行流程: 主程序执行过程可以产生中断去执行中断的内容(保护现场),然后在返回继续执行中断. 中断分 ...

  6. Linux Mysql 备份与还原

    1. 备份 cd /var/lib/mysql //进入到MySQL库目录 mysqldump -u root -p 数据库>/root/backup/数据库.sql 然后输入密码 2. 还原 ...

  7. css 清除浮动 & BFC

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 文档流的概念:html 中 block 块元素默认是单独占据一行的,从上到下排列,也就是我们说的文档流. ...

  8. Nomogram(诺莫图) | Logistic、Cox生存分析结果可视化

    本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/BWpy3F-nEKXCdVXmY3GYZg 当然还有更多R语言,生物信息学相关知识...

  9. (十)SpringBoot之web 应用开发-Servlets, Filters, listeners

    一.需求 Web 开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet. FilterListene 二.案例 2.1 通过注册 ServletRegistr ...

  10. 我对DES AES RSA的认识

    1.DES(Data Encryption Standard)算法:数据加密标准.是替换和置换细致而复杂的结合体,替换和置换一个接着一个,共循环16次.算法首先将明文分块,每块64位.密钥也是64位, ...