[cf1479D]Odd Mineral Resource
先考虑判定是否有解,注意到无解即每一个数都出现偶数次,根据异或的性质,只需要随机$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的更多相关文章
- CF1479X Codeforces Round #700
C Continuous City(图的构造) 题目大意:让你构造一个n\le 32的有向无环无重边图,使得从1走到n的所有路径长度在L,R之间,且每种长度的路径只有唯一一条,$L,R\le 1e6$ ...
- C++ Core Guidelines
C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...
- Spring resource bundle多语言,单引号format异常
Spring resource bundle多语言,单引号format异常 前言 十一假期被通知出现大bug,然后发现是多语言翻译问题.法语中有很多单引号,单引号在format的时候出现无法匹配问题. ...
- Spring5:@Autowired注解、@Resource注解和@Service注解
什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
- 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 【解决方案】 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userHandler': Injection of resource dependencies failed;
一个错误会浪费好多青春绳命 鉴于此,为了不让大家也走弯路,分享解决方案. [错误代码提示] StandardWrapper.Throwableorg.springframework.beans.fac ...
- AngularJS Resource:与 RESTful API 交互
REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.RESTful风格的设计不仅 ...
- 运行nltk示例 Resource u'tokenizers punkt english.pickle' not found解决
nltk安装完毕后,编写如下示例程序并运行,报Resource u'tokenizers/punkt/english.pickle' not found错误 import nltk sentence ...
随机推荐
- Idea热部署功能
什么是Idea自动热部署? 热部署是指代码改动之后,调试过程中会服务自动重启,减少手动重启的麻烦,尤其是在微服务开发中,涉及到很多模块的调试更为重要. 如何开启热部署功能? 1.添加如下依赖到项目模块 ...
- gin 跨域问题
package middlewares import ( "github.com/gin-gonic/gin" "net/http" ) func Cors() ...
- C语言的return语句
Q1:函数中的Return语句有什么用? Q2:Return 0有什么含义吗? A1:Return的作用为,跳出当前的函数,并且返回到调用当前函数的主调函数,当前函数中Return语句一下代码将不会运 ...
- Parameter index out of range(1 > number of parameters, which is 0)参数索引超出范围
今天在写项目的过程中,有一个模块是做多选删除操作,通过servlet获得多选框的value组,然后执行sql操作.如下: 1 @RequestMapping( "/delteCouse.do ...
- vj-2021.6.5-补题
B - B 内容: One day, as Sherlock Holmes was tracking down one very important criminal, he found a wond ...
- mysql update语句的执行流程是怎样的
update更新语句流程是怎么样的 update更新语句基本流程也会查询select流程一样,都会走一遍. update涉及更新数据,会对行加dml写锁,这个DML读锁是互斥的.其他dml写锁需要等待 ...
- Golang通脉之切片
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ su ...
- 【UE4 C++】DateTime、Timespan 相关函数
基于UKismetMathLibrary DateTime 相关函数 Timespan 运算操作相关函数见尾部附录 /** Returns the date component of A */ UFU ...
- 全连接层dense作用
参考来源
- RBAC 权限管理模型
一.RBAC模型--基于角色的访问控制 什么是RBAC RBAC(Role-Based Access Control)基于角色的访问控制.这是从传统的权限模型的基础之上,改进而来并且相当成熟的权限模型 ...