平凡的测试数据

【题目描述】

树链剖分可以干什么?

“可以支持在树中快速修改一个点信息,快速询问一条链信息”

LCT可以干什么?

“可以支持树链剖分支持的特性,并且支持快速链接两个棵树,或者断开某条边”

那我现在要出一道关于树的题目,一开始有n个点,每个点自成一颗树,所以现在有n棵树。每个点有一个权值。有以下这些操作类型:

连接操作:1 a b,连接a和b,使a成为b的儿子结点,a一定是某个树的根节点。这样就把两个数连接到一起,此时a以及所有后代的根节点均为b所在树的根节点。

询问操作:2 a,询问a到自己所在树的根节点所有在路径(包括自己和根节点)上的所有点的权值的异或和。

恩...但是由于我懒,所以还没有造数据,请你帮我写个标程让我用来造数据吧。

【输入格式】

第一行两个整数n和m,表示有n个点和m个操作。

接下有一行n个整数,第i个整数表示第i个点的权值。

接下来m行,每行为三个整数1 a b,或者2 a。

如果是1 a b表示这是一个连接操作,意义见题目。

如果是2 a表示这是一个询问操作,意义见题目。

【输出格式】

对于每个询问操作,输出一行,表示从a到根节点路径上所有点的权值的异或和。

【样例输入】

5 8 1 2 3 4 5 2 2 1 2 1 2 2 1 4 3 1 3 2 2 3 1 5 1 2 5

【样例输出】

2 3 0 4

【提示】

样例解释

样例中每个节点权值与标号相同

第一个询问中2的根节点是自己,所以第一个询问2节点的答案为0

第二个询问中2的根节点是1,路径为2-1,所以答案为2 xor 1 = 3

第三个询问中3到根节点的路径为3-2-1,所以答案为3 xor 2 xor 1 = 0

第四个询问中5到根节点的路径为5-1,所以答案为5 xor 1 = 4

数据范围

对于40%的数据1 <= n,m <= 1000

对于90%的数据1 <= n <= 100000, 1 <= m <= 200000

对于100%的数据1 <= n <= 300000, 1 <= m <= 500000

所有节点的权值均为正整数且在int范围内

【题解】

我向往已久的带权并查集,果然非常有意思,甚至要远超银河英雄传说了。因为亦或和只是到父亲的路径上的,所以在路径压缩的同时就可以维护。每次合并则把接头处亦或一下;每次路径压缩都合并一下自身和父亲的亦或和,再亦或一下父亲去重(利用了两次亦或变回1的性质),这就是维护并查集附加信息的特殊操作了。查询时再find一次,确保输出的是最新结果。对并查集有特殊的偏爱,特别是带权并查集,我还惦记着食物链和奇偶游戏呐。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int sj=300010;
int n,m,fa[sj],a[sj],a1,a2,nn;
long long yh[sj];
bool cl[sj];
int find(int x)
{
    if(fa[x]==x) return x;
    int temp=find(fa[x]);
    yh[x]=a[fa[x]]^yh[x]^yh[fa[x]];
    fa[x]=temp;
    return fa[x];
}
void hb(int x,int y)
{
     yh[x]=a[x]^yh[y];
     y=find(y);
     fa[x]=y;
}
int main()
{
    //freopen("t.txt","r",stdin);
    freopen("td.in","r",stdin);
    freopen("td.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
       scanf("%d",&a[i]);
       fa[i]=i;
       yh[i]=a[i];
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&nn,&a1);
        if(nn==1)
        {
           scanf("%d",&a2);
           hb(a1,a2);
        }
        if(nn==2)
        {
           find(a1);
           printf("%lld\n",yh[a1]);
        }
    }
    //while(1);
    return 0;
}
时间: 2024-08-11 01:21:00

平凡的测试数据的相关文章

cogs2089 平凡的测试数据 并查集

链接:http://cogs.pro/cogs/problem/problem.php?pid=2089 题意:动态修改n个点之间关系,动态查询点到根路径权值异或和. n<=300000,显然LCT(不会)和树剖会超时.要找到O(n)算法. 想到银河英雄传说一题对路径的处理,维护带权并查集,动态将各个集合合并并更新权值,查询时动态查询根节点 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4

2017/07/25 杂题(完全不可做题(划去))选讲

先膜一发主讲人@Antileaf 真是核平的一天那--大脑已经被蹂躏的死去活来了-- cogs2421 简单的Treap 链接:http://cogs.pro/cogs/problem/problem.php?pid=2421 题意:什么都给你了,建出Treap,输出先序遍历顺序. 实际上只是用了Treap的原则建树--先按照数值大小排序,然后按照建立笛卡尔树方法,维护单调栈,最大的全扔到右儿子去即可. 1 #include<iostream> 2 #include<cstdio>

不平凡的当下

感慨岁月的变幻莫测,让时人懂得了珍惜当下,感恩所有. 秋天到了,总感觉心里有一丝丝的凉意,不只是秋风飒飒的感觉吧!社会的大熔炉让太多人开始了转变,也许变得越来越世故,也许变得越来越坚强--这里的"世故"."坚强"等字眼没有任何褒义和贬义,我更喜欢用中性词来形容这种感觉,因为毕竟不是当事人,所以我们无法深切体会到别人的心地,哪怕是同一时间,同一地点对于同一件事物的看法,不同的人也是有不同的思考的. 我们无法回到过去,也无法让明天马上到来,我们能做到的只是把握每一个当下

读《平凡的世界》感想(一)

读<平凡的世界>感想(一) 平凡的世界是一本经典的书,一直想看,最近终于开始品读这部巨著."平凡的世 界"是路遥文集中份量最重的一部长篇,全景式地描写了中国现代城乡生活,通过复杂 的矛盾纠葛,以孙少平等人位代表刻画了社会各阶层普通人们的形象,人生的自尊.自 强与自信,人生的奋斗与拼搏,挫折与追求,痛苦与欢乐,纷繁地交织,读来令人荡气 回肠. 全书的主角是孙少平,他是一个平凡而普通的人,他没有过人的武艺或超群的智慧, 他也有世俗的攀比心和青年人的迷茫:那他凭什么成为一部文学巨

Python生成测试数据

本文出自:http://blog.csdn.net/svitter 生成1~10的随机数1000个: import random fp = open("test", 'w'); for i in range(1, 1000): a = random.randint(1,10) fp.write(str(a)+"\n"); fp.close(); 注意:写入文件的不会在最后写入,而是重新写文件. Python生成测试数据,布布扣,bubuko.com

介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件

先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱[email protected] 可以内部推荐. DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件. DHC的开发背景 在web开发中,服务器端和客户端的开发和测试必不可少,但是测试的工作往往需要服务器端完成之后,客户端才能进行测试,这无疑延后了测试流程,导致服务器端开发完成后,无法进行充分的数据测试,很容易造成服务器端和

自动化测试——利用Python+Selenium批量录入测试数据

背景:测试过程中,为实现将不同的测试数据批量循环录入,考虑需对已通过读取csv文件方式参数化的脚步进一步地参数化,示例代码如下: import csv...data_set = r'C:\\test.csv'data = csv.reader(file(data_set,'rb')) def test_insert(self):    ...    # 每条待录入的数据共四个字段    info0 = 0    info1 = 1    info2 = 2    info3 = 3    for

给iPhone找一条平凡之路

新款iPhone马上就要开发布会了,对于全世界的手机从业者来说,现在的感觉就好像中国人过年:早些时候,大家都盼着过年,放鞭炮.享受美食,小孩子还有压岁钱,但随着生活水平的提高,年味越来越淡,昔日的美好不复存在,甚至出现了"恐归族",逃到异国他乡,逃避过年.近年来的苹果发布会,也大有"过年"的趋势,最早的时候,全世界满怀期待,苹果也总能推出革命性产品,缔造了一个又一个经典瞬间,特别是iPhone3Gs到iPhone4的设计升级,简直亮瞎了双眼,那种感觉就好像父亲在95

[转]Oracle dbms_random函数用法快速生成多条测试数据

做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法. 首先模拟一下100条的随机数据 [sql] view plaincopyprint? select rownum as id, to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime, trunc(dbms_rand