挺不错的一道数据结构题QWQ。

一开始发现这个题如果不看数据范围的话,妥妥的树上莫队啊23333,然鹅10组数据是不可能让你舒舒服服的树上莫队卡过的23333

于是想了想,这个题的模型就是,把u到v链上的权值出现奇偶次的01串搞出来,然后第一个0的位置就是所求。。。。。

但是这个01串并不是很好搞,因为每一位都得异或啊。。。。这样复杂度就要乘上一个 200000/32了(bitset压位),还不如树上莫队呢QWQ

不过有一种套路,叫做hash异或,我们就给每一个权值随机一个unsined long long范围的hash值,大概率保证询问涉及的子集的异或和不为0(这个主要看人品了。。。因为总的来说肯定会有很多子集的异或和为0,但是因为子集总数太过庞大,询问涉及的只是小部分,所以出错概率还是很小的2333)

这样,如果一个区间所有数都出现奇数次,那么区间的hash异或起来就和 路径权值线段树在这个区间异或起来的值一样了,直接在主席树上二分即可。。。

(注意lca是要被算上的,但是如果直接用到根前缀的两个主席树异或的话lca是会被消去的)

#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int maxn=200005;
#define mid (l+r>>1)
int T,n,a[maxn],m,to[maxn*2],ne[maxn*2],dep[maxn],le,w,A,B,ans;
int hd[maxn],num,siz[maxn],son[maxn],cl[maxn],f[maxn],ri,lca;
inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;}
ll val[maxn],Xor[maxn],now;
struct node{ll sum;node *lc,*rc;
}nil[maxn*37],*rot[maxn],*cnt;inline void init(){nil->sum=0;nil->lc=nil->rc=rot[0]=cnt=nil;fill(hd+1,hd+n+1,0),num=0;memset(son,0,sizeof(son));
}node *update(node *u,int l,int r){node *ret=++cnt;*ret=*u,ret->sum^=val[le];if(l==r) return ret;if(le<=mid) ret->lc=update(ret->lc,l,mid);else ret->rc=update(ret->rc,mid+1,r);return ret;
}void query(node *u,int l,int r){if(l>=le&&r<=ri){ now^=u->sum; return;}if(le<=mid) query(u->lc,l,mid);if(ri>mid) query(u->rc,mid+1,r);
}void Fdfs(int x,int fa){f[x]=fa,siz[x]=1,dep[x]=dep[fa]+1;le=a[x],rot[x]=update(rot[fa],1,200001);for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa){Fdfs(to[i],x),siz[x]+=siz[to[i]];if(!son[x]||siz[to[i]]>siz[son[x]]) son[x]=to[i];}
}void Sdfs(int x,int tp){cl[x]=tp;if(!son[x]) return;Sdfs(son[x],tp);for(int i=hd[x];i;i=ne[i]) if(to[i]!=f[x]&&to[i]!=son[x]) Sdfs(to[i],to[i]);
}int LCA(int x,int y){while(cl[x]!=cl[y]){if(dep[cl[x]]>dep[cl[y]]) x=f[cl[x]];else y=f[cl[y]];}return dep[x]<dep[y]?x:y;
}void query(node *u,node *v,int l,int r){if(l==r){ ans=l; return;}if((u->lc->sum^v->lc->sum^((a[lca]>=l&&a[lca]<=mid)?val[a[lca]]:0))==(Xor[mid]^Xor[l-1])) query(u->rc,v->rc,mid+1,r);else query(u->lc,v->lc,l,mid);
}inline void solve(){Fdfs(1,0),Sdfs(1,1);while(m--){scanf("%d%d",&A,&B),lca=LCA(A,B);query(rot[A],rot[B],1,200001);printf("%d\n",ans);}
}int main(){
//  freopen("data.in","r",stdin);
//  freopen("data.out","w",stdout);val[1]=1;for(int i=2;i<=200001;i++) val[i]=val[i-1]*233ll;for(int i=1;i<=200001;i++) Xor[i]=val[i]^Xor[i-1];scanf("%d",&T);while(T--){init(),scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",a+i);int uu,vv;for(int i=1;i<n;i++) scanf("%d%d",&uu,&vv),add(uu,vv),add(vv,uu);solve();}return 0;
}

转载于:https://www.cnblogs.com/JYYHH/p/9099254.html

[Lydsy1805月赛] 对称数相关推荐

  1. [Lydsy1805月赛]对称数 BZOJ5361

    分析: 这个题,还是蛮有趣的.考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和. 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑 ...

  2. 对称数java算法_对称数的简单实现

    在百度面试题中看到这样一个题,可能比较老套了,这里为了学习,自己写了改写了个简单算法. 我们把一个数字倒着读和原数字相同的数字称之为对称数, (例如1,121,88,8998),不考虑性能,请找出1- ...

  3. (C语言)对称数判断

    Description 输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值: 例如 12321是对称数,输出yes,124421 ...

  4. 对称数(自己的算法)

    题目描述 给定一个数字,获取大于此数字的下一个数字X, 要求 X 为对称数字. 样例输入 451 3840 3363 999 样例输出 454 3883 3443 1001 注:对于每个测试实例,要求 ...

  5. python 找对称数

    [问题描述]已知10个四位数输出所有对称数及个数 n,例如1221.2332都是对称数 [输入形式]10个四位数,以空格分隔开 [输出形式]输入的四位数中的所有对称数,对称数个数 [样例输入]1221 ...

  6. Python:找对称数

    [问题描述] 已知10个四位数输出所有对称数及个数 n,例如1221.2332都是对称数 [输入形式] 10个四位数,以空格分隔开 [输出形式] 输入的四位数中的所有对称数,对称数个数 [样例输入] ...

  7. [数据结构与算法]输出1~10000中的对称数

    var result = []; for(let i=1;i<10;i++){ result.push(i*11); // 两位数的对称数for(let j=0;j<10;j++){res ...

  8. C语言——判断一个数是不是回文数(对称数)

    使用C语言判断某一个数是否是回文数(对称数),此次为个人练习,若有错误敬请提出. 首先,我们需要知道回文数就是对称数,例如:12321是回文数(对称数),124421是回文数(对称数),1231不是回 ...

  9. 探讨“对称数”的判断算法

    c语言实现算法 所谓对称数就是指5,88,404,3223等从左往右或从右往左读都相同的数,而89,123,2323这样的数就不是对称数了.现在要求编程判断以字符串的形式给出的对称数,但不能用字符判断 ...

最新文章

  1. python如何入侵服务器的_通过redis入侵服务器的步骤
  2. 【转】Magento2 数据库操作
  3. c++用new求数组中n个数的和_在C++中实现任意大小数组的定义方法
  4. Nginx应用场景之HTTP服务器
  5. 对于linux socket与epoll配合相关的一些心得记录(转)
  6. centos 添加路由命令_详解CentOS 6.4 添加永久静态路由所有方法汇总
  7. 使用for循环遍历文件、使用while循环遍历文件
  8. freebsd安装linux网卡驱动,FreeBSD安装后的网卡配置
  9. 【声学检测】基于matlab MFCC+GMM安全事件声学检测系统【含Matlab源码 1699期】
  10. php网页错误404,php出现404错误页面的解决方法
  11. SELECT list is not in GROUP BY clause and contains nonaggregated column 异常
  12. 24位RGB颜色转换为16位RGB
  13. 小白也能懂的 Python 入门指南(1)——Python 的前世今生
  14. LayUI 之动态树形菜单
  15. EPS主要逻辑网元功能
  16. 在国内外市场均遭遇挫折的OPPO和vivo该反思了
  17. 换硬币 (20 分)Java【循环】
  18. android车载系统测试,【图】原生安卓来了!Polestar 2智能车联测试_汽车之家
  19. 智能书包方案——智能书包重力测量模块CSM92F32
  20. Eigen的介绍、安装

热门文章

  1. IQueryable和IEnumerable区别
  2. 怎么让织梦文章按照权重排序
  3. 在.NET中用excel导出(概要)
  4. java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
  5. 前端性能优化之Lazyload
  6. Apple着手抛弃32位macOS应用程序
  7. 交叉编译HTOP并移植到ARM嵌入式Linux系统
  8. 编程之美-第3章 结构之法
  9. 公司那些事-关于领导
  10. mysql读写分离_MySQL基于amoeba读写分离实验