[Lydsy1805月赛] 对称数
挺不错的一道数据结构题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月赛] 对称数相关推荐
- [Lydsy1805月赛]对称数 BZOJ5361
分析: 这个题,还是蛮有趣的.考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和. 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑 ...
- 对称数java算法_对称数的简单实现
在百度面试题中看到这样一个题,可能比较老套了,这里为了学习,自己写了改写了个简单算法. 我们把一个数字倒着读和原数字相同的数字称之为对称数, (例如1,121,88,8998),不考虑性能,请找出1- ...
- (C语言)对称数判断
Description 输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值: 例如 12321是对称数,输出yes,124421 ...
- 对称数(自己的算法)
题目描述 给定一个数字,获取大于此数字的下一个数字X, 要求 X 为对称数字. 样例输入 451 3840 3363 999 样例输出 454 3883 3443 1001 注:对于每个测试实例,要求 ...
- python 找对称数
[问题描述]已知10个四位数输出所有对称数及个数 n,例如1221.2332都是对称数 [输入形式]10个四位数,以空格分隔开 [输出形式]输入的四位数中的所有对称数,对称数个数 [样例输入]1221 ...
- Python:找对称数
[问题描述] 已知10个四位数输出所有对称数及个数 n,例如1221.2332都是对称数 [输入形式] 10个四位数,以空格分隔开 [输出形式] 输入的四位数中的所有对称数,对称数个数 [样例输入] ...
- [数据结构与算法]输出1~10000中的对称数
var result = []; for(let i=1;i<10;i++){ result.push(i*11); // 两位数的对称数for(let j=0;j<10;j++){res ...
- C语言——判断一个数是不是回文数(对称数)
使用C语言判断某一个数是否是回文数(对称数),此次为个人练习,若有错误敬请提出. 首先,我们需要知道回文数就是对称数,例如:12321是回文数(对称数),124421是回文数(对称数),1231不是回 ...
- 探讨“对称数”的判断算法
c语言实现算法 所谓对称数就是指5,88,404,3223等从左往右或从右往左读都相同的数,而89,123,2323这样的数就不是对称数了.现在要求编程判断以字符串的形式给出的对称数,但不能用字符判断 ...
最新文章
- python如何入侵服务器的_通过redis入侵服务器的步骤
- 【转】Magento2 数据库操作
- c++用new求数组中n个数的和_在C++中实现任意大小数组的定义方法
- Nginx应用场景之HTTP服务器
- 对于linux socket与epoll配合相关的一些心得记录(转)
- centos 添加路由命令_详解CentOS 6.4 添加永久静态路由所有方法汇总
- 使用for循环遍历文件、使用while循环遍历文件
- freebsd安装linux网卡驱动,FreeBSD安装后的网卡配置
- 【声学检测】基于matlab MFCC+GMM安全事件声学检测系统【含Matlab源码 1699期】
- php网页错误404,php出现404错误页面的解决方法
- SELECT list is not in GROUP BY clause and contains nonaggregated column 异常
- 24位RGB颜色转换为16位RGB
- 小白也能懂的 Python 入门指南(1)——Python 的前世今生
- LayUI 之动态树形菜单
- EPS主要逻辑网元功能
- 在国内外市场均遭遇挫折的OPPO和vivo该反思了
- 换硬币 (20 分)Java【循环】
- android车载系统测试,【图】原生安卓来了!Polestar 2智能车联测试_汽车之家
- 智能书包方案——智能书包重力测量模块CSM92F32
- Eigen的介绍、安装