先考虑判定是否有解,注意到无解即每一个数都出现偶数次,根据异或的性质,只需要随机$V_{i}$,假设$u$到$v$路径上所有节点构成集合$S$,若$\bigoplus_{x\in S,l\le a_{x}\le r}V_{a_{x}}=0$即无解

考虑如何快速计算上述值,根据异或的自反性,对其差分,也即统计一个节点到根路径上的权值异或,建立线段树,并在其父亲的基础上可持久化即可

更进一步的,在这个线段树上二分即可得到答案(即先判定每一段是否为0,再在其中二分)

时间复杂度为$o(n\log n)$,即可通过

下面来分析概率,假设$V_{i}$的随机范围为$[0,V)$(其中$V$为2的幂次),考虑答案错误的概率——

考虑一次询问中,求得异或为0但实际存在出现奇数次权值的概率,即$\frac{1}{V}$

总共询问$o(q\log n)$次,可以估计概率为$\frac{q\log n}{V}$,当$V\sim 2^{64}$即足够高

(另外注意随机时,如果是选择若干个数相乘,需要判定最终结果不为0)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define ull unsigned long long
5 #define mid (l+r>>1)
6 struct Edge{
7 int nex,to;
8 }edge[N<<1];
9 int V,E,n,q,x,y,l,r,z,zz,head[N],dep[N],rt[N],a[N],f[N][21],ls[N*20],rs[N*20];
10 ull R[N],sum[N*20];
11 int New(int k){
12 sum[++V]=sum[k];
13 ls[V]=ls[k];
14 rs[V]=rs[k];
15 return V;
16 }
17 void add(int x,int y){
18 edge[E].nex=head[x];
19 edge[E].to=y;
20 head[x]=E++;
21 }
22 int lca(int x,int y){
23 if (dep[x]<dep[y])swap(x,y);
24 for(int i=20;i>=0;i--)
25 if (dep[f[x][i]]>=dep[y])x=f[x][i];
26 if (x==y)return x;
27 for(int i=20;i>=0;i--)
28 if (f[x][i]!=f[y][i]){
29 x=f[x][i];
30 y=f[y][i];
31 }
32 return f[x][0];
33 }
34 void update(int &k,int l,int r,int x,ull y){
35 k=New(k);
36 sum[k]^=y;
37 if (l==r)return;
38 if (x<=mid)update(ls[k],l,mid,x,y);
39 else update(rs[k],mid+1,r,x,y);
40 }
41 int query(int k1,int k2,int k3,int k4,int l,int r,int x,int y){
42 if ((l>y)||(x>r))return -1;
43 if ((x<=l)&&(r<=y)){
44 if (!(sum[k1]^sum[k2]^sum[k3]^sum[k4]))return -1;
45 }
46 if (l==r)return l;
47 int ans=query(ls[k1],ls[k2],ls[k3],ls[k4],l,mid,x,y);
48 if (ans>=0)return ans;
49 return query(rs[k1],rs[k2],rs[k3],rs[k4],mid+1,r,x,y);
50 }
51 void dfs(int k,int fa,int s){
52 dep[k]=s;
53 f[k][0]=fa;
54 for(int i=1;i<=20;i++)f[k][i]=f[f[k][i-1]][i-1];
55 rt[k]=rt[fa];
56 update(rt[k],1,n,a[k],R[a[k]]);
57 for(int i=head[k];i!=-1;i=edge[i].nex)
58 if (edge[i].to!=fa)dfs(edge[i].to,k,s+1);
59 }
60 int main(){
61 srand(time(0));
62 scanf("%d%d",&n,&q);
63 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
64 for(int i=1;i<=n;i++)
65 while (!R[i])R[i]=(ull)rand()*(ull)rand()*(ull)rand()*(ull)rand()*(ull)rand();
66 memset(head,-1,sizeof(head));
67 for(int i=1;i<n;i++){
68 scanf("%d%d",&x,&y);
69 add(x,y);
70 add(y,x);
71 }
72 dfs(1,0,1);
73 for(int i=1;i<=q;i++){
74 scanf("%d%d%d%d",&x,&y,&l,&r);
75 z=lca(x,y),zz=f[z][0];
76 printf("%d\n",query(rt[x],rt[y],rt[z],rt[zz],1,n,l,r));
77 }
78 }

[cf1479D]Odd Mineral Resource的更多相关文章

  1. CF1479X Codeforces Round #700

    C Continuous City(图的构造) 题目大意:让你构造一个n\le 32的有向无环无重边图,使得从1走到n的所有路径长度在L,R之间,且每种长度的路径只有唯一一条,$L,R\le 1e6$ ...

  2. C++ Core Guidelines

    C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...

  3. Spring resource bundle多语言,单引号format异常

    Spring resource bundle多语言,单引号format异常 前言 十一假期被通知出现大bug,然后发现是多语言翻译问题.法语中有很多单引号,单引号在format的时候出现无法匹配问题. ...

  4. Spring5:@Autowired注解、@Resource注解和@Service注解

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

  5. 【初探Spring】------Spring IOC(三):初始化过程---Resource定位

    我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...

  6. 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  7. 【解决方案】 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userHandler': Injection of resource dependencies failed;

    一个错误会浪费好多青春绳命 鉴于此,为了不让大家也走弯路,分享解决方案. [错误代码提示] StandardWrapper.Throwableorg.springframework.beans.fac ...

  8. AngularJS Resource:与 RESTful API 交互

    REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.RESTful风格的设计不仅 ...

  9. 运行nltk示例 Resource u'tokenizers punkt english.pickle' not found解决

    nltk安装完毕后,编写如下示例程序并运行,报Resource u'tokenizers/punkt/english.pickle' not found错误 import nltk sentence ...

随机推荐

  1. js 改变this指向的三种方法 bind call apply

    先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 ...

  2. Server Tools(服务器工具)

    服务器工具 1.发布 # Process: MXD 转 Web 地图 arcpy.MXDToWebMap_server("", "", "" ...

  3. 2021.3.3--vj补题

    题目 C - C CodeForces - 1166C The legend of the foundation of Vectorland talks of two integers xx and  ...

  4. Typora配置双击图片放大功能

    在Typora中,默认没有点击图片放大功能,本文就教大家如何配置该功能. 我的环境版本 Typora版本:0.11.13 LightBox版本:2.11.3 下载LightBox 可以从Github下 ...

  5. NXOpen.BlockStyler的一些用法

    关于BLOCK UI的一些控件的用法,本人曾经使用的代码,拿出来共享: Option Strict Off Imports NXOpen Imports NXOpen.BlockStyler Impo ...

  6. 【转载】如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结

    [好文章值得分享,摘自作者:jesse] 来源:www.armjishu.com作者:jesse转载请注明出处 我的另一篇文章:<STM32嵌入式入门必看之文章-----介绍非常详细!(学STM ...

  7. Vue el 使用el-checkbox-group复选框进行单选框操作

    el-checkbox-group这个组件与其他复选框不一样,我当初也是半天不知道怎么操作 页面使用v-model绑定 size就是等比例缩小放大,v-ror循环应该看的懂.重要的是@chage到我们 ...

  8. 面试不再慌,终于有人把TCP讲明白了。。。

    前言 TCP(Transmission Control Protocol,传输控制协议) 是计算机网络的的重要组成部分,也是网络编程的重要内容,还有我们平时接触最多的 HTTP 也是基于 TCP 实现 ...

  9. mongodb的索引操作

    在mongodb中,当我们一个集合中的数据量非常大时,比如几百万条数据,如果不使用索引,对数据的查询就会进行全表扫描,这个时候查询的速度就会非常的慢,此时我们就需要为集合建立上索引,从而加快查询的速度 ...

  10. Linux该如何学习新手入门遇到问题又该如何解决

    本节旨在介绍对于初学者如何学习 Linux 的建议.如果你已经确定对 Linux 产生了兴趣,那么接下来我们介绍一下学习 Linux 的方法. 如何去学习 学习大多类似庖丁解牛,对事物的认识一般都是由 ...