题解:n个集合,你要进行m个操作。总共有3种操作。第一种,合并两个集合x和y。第二张,把特定的集合里面所有的数字加一。第三种,询问在某个集合里面,对于所有数字对2的k次方取模后,有多少个数字等于x。

思路:我们可以对于每一个节点保存一个lazy标记,这个标记类似于线段树中的lazy标记。每次整个集合增加的时候,只改变lazy标记,然后在下一次访问这个节点的时候,再去把这个标记push_down。而这个push_down的方式就是按照之前说的那样,根据lazy的奇偶来判断是否应该交换儿子和额外进位。对于每一个查询操作,我们直接把放到字典树中,确定一个位置,输出对应节点的size即可。具体操作的时候还要注意,一定要把每一个插入的数字固定插入长度设置为30,因为数字的高位即使为0也是需要保存的。

 

参考代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e6+;
const int depth=; struct Trie{
#define ls T[x].ch[0]
#define rs T[x].ch[1]
int tot;
struct Node{
int siz,ch[],tag;
} T[maxn<<];
void Init(){tot=;}
int NewNode(){memset(&T[++tot],,sizeof(T[]));return tot;} void pushdown(int x)
{
int lz=T[x].tag;
if(lz&){swap(ls,rs);T[ls].tag++;}
T[ls].tag+=lz/; T[rs].tag+=lz/;
T[x].tag=;
} void Insert(int &rt,int x)
{
int o=rt?rt:rt=NewNode(),c;
for(int i=;i<depth;++i)
{
c=x&; x>>=; T[o].siz++;
if(T[o].tag) pushdown(o);
if(!T[o].ch[c]) T[o].ch[c]=NewNode();
o=T[o].ch[c];
}
} int query(int rt,int x,int y)
{
int o=rt;
for(int k=;k<y;++k)
{
if(T[o].tag) pushdown(o);
o=T[o].ch[x&];x>>=;if(!o) break;
}
return T[o].siz;
} void Merge(int x,int y)
{
T[x].siz+=T[y].siz;
if(T[x].tag) pushdown(x);
if(T[y].tag) pushdown(y);
for(int i=;i<;++i)
{
if(T[x].ch[i]&&T[y].ch[i]) Merge(T[x].ch[i],T[y].ch[i]);
if(!T[x].ch[i]&&T[y].ch[i]) T[x].ch[i]=T[y].ch[i];
}
}
} trie; int n,m,rt[maxn],f[maxn]; int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
} int main()
{
while(~scanf("%d",&n))
{
scanf("%d",&m);
memset(rt,,sizeof rt);
trie.Init();
for(int i=;i<=n;i++)
{
f[i]=i;
int x;scanf("%d",&x);
trie.Insert(rt[i],x);
}
while(m--)
{
int op,x,y,z;
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&x,&y);
x=find(x); y=find(y);
if(x!=y) trie.Merge(rt[x],rt[y]),f[y]=x;
}
if(op==)
{
scanf("%d",&x);
trie.T[rt[find(x)]].tag++;
}
if(op==)
{
scanf("%d%d%d",&x,&y,&z);
x=find(x);
printf("%d\n",trie.query(rt[x],z,y));
}
}
}
return ;
}

2018 ICPC南京网络赛 Set(字典树 + 合并 + lazy更新)的更多相关文章

  1. 2018 ICPC南京网络赛 L Magical Girl Haze 题解

    大致题意: 给定一个n个点m条边的图,在可以把路径上至多k条边的权值变为0的情况下,求S到T的最短路. 数据规模: N≤100000,M≤200000,K≤10 建一个立体的图,有k层,每一层是一份原 ...

  2. 【2018 ICPC南京网络赛 A】An Olympian Math Problem(数论题)

    Alice, a student of grade 6, is thinking about an Olympian Math problem, but she feels so despair th ...

  3. 2018 ICPC 沈阳网络赛

    2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...

  4. 2018 ICPC 徐州网络赛

    2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...

  5. 2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat

    题意:四个操作,区间加,区间每个数乘,区间的数变成 2^64-1-x,求区间和. 题解:2^64-1-x=(2^64-1)-x 因为模数为2^64,-x%2^64=-1*x%2^64 由负数取模的性质 ...

  6. 2018 ACM南京网络赛H题Set解题报告

    题目描述 给定\(n\)个数$a_i$,起初第\(i\)个数在第\(i\)个集合.有三种操作(共\(m\)次): 1 $u$ $v$ 将第$u$个数和第$v$个数所在集合合并 2 $u$ 将第$u$个 ...

  7. 2018 ICPC青岛网络赛 B. Red Black Tree(倍增lca好题)

    BaoBao has just found a rooted tree with n vertices and (n-1) weighted edges in his backyard. Among ...

  8. 2019icpc南京网络赛 A 主席树

    题意 给一个\(n\times n\)的螺旋矩阵,给出其中的\(m\)个点的值分别为各个点上数字的数位之和,给出\(q\)个询问,每次询问从\((x1,y1)\)到\((x2,y2)\)的子矩阵的和. ...

  9. 2019icpc南京网络赛 F 主席树

    题意 给一个\(n\)的全排列数组\(a\),求一个递推数组每一项的值:\(ans[i]=ans[j]+1\),\(j\)为\(a[pos[i]-k]到a[pos[i]+k],(pos[i]为i在数组 ...

随机推荐

  1. go中的数据结构字典-map

    1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...

  2. spark-宽依赖和窄依赖

    一.窄依赖(Narrow Dependency,) 即一个RDD,对它的父RDD,只有简单的一对一的依赖关系.也就是说, RDD的每个partition ,仅仅依赖于父RDD中的一个partition ...

  3. 心里有点B树

    在说B树之前最好先看看2-3树, 2-3树是B树的一种特例, 什么B树, B树就是2-3树, 2-3-4 树 , 2-3-4-5... 树的统称, 而B+树又是B树的一种变形 性质: 什么是二节点, ...

  4. C. Present(二分 + 扫描线)

    题目链接:http://codeforces.com/contest/460/problem/C 题意: n盆花,浇k次水, 每次可使花高度 + 1, 每次可浇相邻的w盆,ai 表示 i-th盆花 的 ...

  5. LeetCode51 N皇后——经典dfs+回溯(三段式解法)

    代码如下: class Solution { public: // record[row] 该行对应的列 vector<vector<string> > ans; // 结果集 ...

  6. 软件测试从业者必备的高频Linux命令

    命令 cd 1.如何进入上级目录 cd .. 2.如何进入当前用户主目录 cd ~ 3.如何进入上两级目录 cd ../.. 4.进入当前目录命令 cd . 5.如何进入目录 /usr/isTeste ...

  7. Python 编程语言要掌握的技能之一:编写条件分支代码的技巧

    Python 里的分支代码 Python 支持最为常见的 if/else 条件分支语句,不过它缺少在其他编程语言中常见的 switch/case 语句. 除此之外,Python 还为 for/whil ...

  8. IDEA连接Redis

    1.创建一个Maven项目 2.在src下的pom.xml文件里,添加相关包引用 <?xml version="1.0" encoding="UTF-8" ...

  9. Mysql查询语句之排序查询

    语法: /* select 查询列表 from 表 [where 筛选条件] order by 排序列表 [asc/desc] */ ①asc为升序,desc为降序,且默认为升序 ②order by子 ...

  10. Linux服务和systemctl详解

    定义 A Linux service is an application (or set of applications) that runs in the background waiting to ...