题解: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. python while指令

    while指令 1.它后面可以带一个 Ture 表示一直是真的,这样程序会在while循环里无限进行下去 eg: while Ture: print("打印这个...") 2.它后 ...

  2. 花一天时间试玩vsphere6.7(EXSI)服务器版的vmware

    花一天时间试玩vsphere6.7(EXSI)服务器版的vmware 要注册账号(2019年11月14注册): 登陆网址:https://my.vmware.com/cn/group/vmware/h ...

  3. 如何基于 PHP-X 快速开发一个 PHP 扩展

    0x01 起步 PHP-X本身基于C++11开发,使用cmake进行编译配置.首先,你需要确定所有依赖项已安装好.包括: gcc-4.8 或更高版本 PHP7.0 或更高版本,需要php7-dev 开 ...

  4. Mongodb自动备份数据库并删除指定天数前的备份

    1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod_bak/mongod_bak_now mkdir -p /home/backup/mongod_bak/ ...

  5. paper sharing :学习特征演化的数据流

    特征演化的数据流 数据流学习是近年来机器学习与数据挖掘领域的一个热门的研究方向,数据流的场景和静态数据集的场景最大的一个特点就是数据会发生演化,关于演化数据流的研究大多集中于概念漂移检测(有监督学习) ...

  6. 领扣(LeetCode)删除链表的倒数第N个节点 个人题解

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  7. dbstructsync 多套mysql环境表、字段、索引的差异sql产出(原创)

    最近写了一个工具(比较两套测试环境数据库表.表字段.索引的差异) 功能:可以比较两套环境中mysql指定库中表.表字段及索引的差异,返回具体需要同步的执行sql A环境的数据库db 作为sourced ...

  8. C# 彻底搞懂async/await

    前言 Talk is cheap, Show you the code first! private void button1_Click(object sender, EventArgs e) { ...

  9. vue中自定义html文件的模板

    如果默认生成的 HTML 文件不适合需求,可以创建/使用自定义模板. 一是通过 inject 选项,然后传递给定制的 HTML 文件.html-webpack-plugin 将会自动注入所有需要的 C ...

  10. LXC容器文件系统设计优化

    在HOST上面,一个LXC container包含一个config文件和一个rootfs目录. 早期我们在交叉编译系统上编译出container的rootfs之后,直接在编译系统上将其用tar压缩打包 ...