[cf1261F]Xor-Set
构造一棵权值范围恰为$[0,2^{60})$的权值线段树,考虑其中从下往上第$h$层($0\le h\le 60$)中的一个区间,假设其左端点为$l$,即$[l,l+2^{h})$
这样的一个区间具有一个很好的性质,其是按位独立的,即其等价于二进制下最高的$60-h$位与$l$相同,剩下的$h$位任意的数所构成的集合
对于这样的两个集合$[l_{1},l_{1}+2^{h_{1}})$和$[l_{2},l_{2}+2^{h_{2}})$合并的结果,也就是最高的$60-\max(h_{1},h_{2})$位与$l_{1}\oplus l_{2}$相同,剩下的$\max(h_{1},h_{2})$位任意的数所构成的集合,证明利用按位独立的性质分析即可
更具体的,合并结果对应于区间$[l_{3},l_{3}+2^{\max(h_{1},h_{2})})$,其中$l_{3}=(l_{1}\oplus l_{2})\and (2^{60}-2^{\max(h_{1},h_{2})}))$(后者的意义即取$l_{1}\oplus l_{2}$二进制下最高的$60-\max(h_{1},h_{2})$位)
考虑将$n_{a}$和$n_{b}$个区间分别插入线段树,划分为$\log V$个线段树上区间(即分别有$n_{a}\log V$和$n_{b}\log V$个区间),将其两两按上述方法合并,再对最终的区间快排,复杂度即$o(n^{2}\log^{3}V)$(其中$V$为值域,即$10^{18}$)
这样的复杂度是不能接受的,需要进行优化
对于这个合并的结果(不妨假设$h_{1}\ge h_{2}$),等价于$[l_{1},l_{1}+2^{h_{1}})$与$[l_{3},l_{3}+2^{h_{1}})$(其中$l_{3}=l_{2}\and(2^{60}-2^{h_{1}})$),在线段树上也就是$[l_{2},l_{2}+2^{h_{2}})$这个区间所对应的节点在从下往上第$h_{1}$层的祖先
(以$n_{a}$个区间为例)定义一个节点被标记即其是$n_{a}\log V$个区间中的一个,将所有节点分为三类:
1.其自身被标记
2.其自身未被标记且其子树内存在节点被标记
3.其子树内(包括自身)无节点被标记
类似地,对于$n_{b}\log V$个区间也可以得到节点类型,那么也就可以看作$n_{a}\log V$个区间中1类节点和$n_{b}\log V$个区间中的2类节点两两合并以及前者的2类节点和后者的1类节点两两合并
(关于原因可以参考前面的说明,也就是将所有节点先提到同一层)
对于这样的复杂度,分别考虑每一层第1类和第2类节点个数:
1.第1类节点,也就是被严格包含,但如果其与其兄弟同时被包含即不需要被插入,同时被包含的节点必然是连续若干个,那么至多两个(否则必然存在兄弟)
2.第2类节点,也就是线段树在递归过程中经过且未结束的节点,更具体的即有交点但不被包含,显然每一次插入后每一层至多新增两个(最左边和最右边)
综上,每一层两类的节点数都是$o(n)$的,那么每一层合并复杂度为$o(n^{2})$,总区间个数降为$o(n^{2}\log V)$,再对其排序复杂度即$o(n^{2}\log^{2}V)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 #define mod 998244353
5 #define ll long long
6 #define mid (l+r>>1)
7 #define pll pair<ll,ll>
8 #define fi first
9 #define se second
10 pll a[8*N*N*N];
11 vector<ll>v[4][N];
12 int V,rt,n,na,nb,ans,ls[4*N*N],rs[4*N*N];
13 ll m,x,y;
14 int sum(ll x,ll y){
15 int s1=(x+y)%mod,s2=(y-x+1)%mod;
16 return 1LL*s1*s2%mod*(mod+1)/2%mod;
17 }
18 void update(int p,int &k,ll l,ll r,ll x,ll y,int z){
19 if ((l>y)||(x>r))return;
20 if (!k)k=++V;
21 if ((x<=l)&&(r<=y)){
22 v[p][z].push_back(l);
23 return;
24 }
25 v[p+2][z].push_back(l);
26 update(p,ls[k],l,mid,x,y,z-1);
27 update(p,rs[k],mid+1,r,x,y,z-1);
28 }
29 int main(){
30 m=(1LL<<60)-1;
31 scanf("%d",&na);
32 for(int i=1;i<=na;i++){
33 scanf("%lld%lld",&x,&y);
34 update(0,rt,0,m,x,y,60);
35 }
36 scanf("%d",&nb);
37 for(int i=1;i<=nb;i++){
38 scanf("%lld%lld",&x,&y);
39 update(1,rt,0,m,x,y,60);
40 }
41 for(int i=0;i<=60;i++){
42 for(int j=0;j<v[0][i].size();j++)
43 for(int k=0;k<v[1][i].size();k++){
44 x=(v[0][i][j]^v[1][i][k]);
45 a[++n]=make_pair(x,x+(1LL<<i)-1);
46 }
47 for(int j=0;j<v[0][i].size();j++)
48 for(int k=0;k<v[3][i].size();k++){
49 x=(v[0][i][j]^v[3][i][k]);
50 a[++n]=make_pair(x,x+(1LL<<i)-1);
51 }
52 for(int j=0;j<v[1][i].size();j++)
53 for(int k=0;k<v[2][i].size();k++){
54 x=(v[1][i][j]^v[2][i][k]);
55 a[++n]=make_pair(x,x+(1LL<<i)-1);
56 }
57 }
58 sort(a+1,a+n+1);
59 ll s=0;
60 for(int i=1;i<=n;i++){
61 if (a[i].fi>s)ans=(ans+sum(a[i].fi,a[i].se))%mod;
62 else{
63 if (s<a[i].se)ans=(ans+sum(s+1,a[i].se))%mod;
64 }
65 s=max(s,a[i].se);
66 }
67 printf("%d",ans);
68 }
[cf1261F]Xor-Set的更多相关文章
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
- 二分+DP+Trie HDOJ 5715 XOR 游戏
题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- BZOJ 2115 【Wc2011】 Xor
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
- xor和gates的专杀脚本
前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor. 首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xo ...
- Codeforces617 E . XOR and Favorite Number(莫队算法)
XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...
- Xor && 线性基练习
#include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...
- BC之Claris and XOR
http://acm.hdu.edu.cn/showproblem.php?pid=5661 Claris and XOR Time Limit: 2000/1000 MS (Java/Others) ...
- 异或链表(XOR linked list)
异或链表(Xor Linked List)也是一种链式存储结构,它可以降低空间复杂度达到和双向链表一样目的,任何一个节点可以方便的访问它的前驱节点和后继结点.可以参阅wiki 普通的双向链表 clas ...
- hdu 5661 Claris and XOR
Claris and XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- [BZOJ 2819]NIM(dfs序维护树上xor值)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2819 分析: 树上的nim游戏,关键就是要判断树上的一条链的异或值是否为0 这个题目有 ...
随机推荐
- mysql创建用户及赋予某用户权限(附带基础查看表内容)
首先登陆mysql 一:show databases; 展示所有数据库(root用户下) 二:use xxx (数据库名)使用use选择数据库 三:show xxx 查看数据库中的表 四:des ...
- 微信小程序内判断是否关注公众号(JAVA)
微信小程序内判断是否关注公众号(JAVA) 思路来源(第二种): https://blog.csdn.net/Yanheeee/article/details/117295643 /** * 总体思路 ...
- bzoj1407,洛谷2421 NOI2002荒岛野人
题目大意: 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,-,M.岛上住着N个野人,一开始依次住在山洞C1,C2,-,CN中,以后每年,第i个野人会沿顺时针向前走P ...
- EPUB文件格式简单解析
最近热衷于看轻小说,奈何某些网站样式排版属实糟糕,移动端体验极度不友好,实在无法忍受,于是希望能将网站内容爬取下来制作成EPUB格式的电子书. 抛开爬取网站内容不谈,通过解析EPUB文件后,大致掌握了 ...
- redis两种持久化策略/存储模式
redis的持久化策略 RDB,即 Redis DataBase,以快照形式将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的dump文件,达到数据恢复. 默认开启,见redis ...
- 复杂对象List集合的排序
对于集合的排序,直接的有sort().间接的有借用compareTo.Comparable等,但是对于相对复杂的对象集合,还得自己实现方法来处理. 现在有这样一个思路: 第一步:从需要排序的对象集合中 ...
- Windows 10下CUDA及cuDNN的安装 —— Pytorch
Windows 10下CUDA及cuDNN的安装 CUDA简介与下载地址 CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台. CU ...
- Ajax样例
$.ajax({ url : "newsservlet",//请求地址 dataType : "json",//数据格式 type : "post&q ...
- SpringCloud微服务实战——搭建企业级开发框架(五):数据库持久化集成MySql+Druid+MyBatis-Plus
在引入相关数据库持久化相关依赖库之前,我们可以考虑到,当我们因业务开发需要,引入各种各样的依赖库时,Jar包冲突是我们必须面对的一个问题,Spring为了解决这些Jar包的冲突,推出了各种bom, ...
- AIApe问答机器人Scrum Meeting 4.29
Scrum Meeting 4 日期:2021年4月29日 会议主要内容概述:汇报两日工作,讨论任务优先级. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明 ...