可持久化trie树?好像和可持久化权值线段树差不多。。

如果这题没有那个\(x[i]\)这题就是一个裸的可持久化trie树。

仔细想想,多了这个\(x[i]\)之后有什么影响?

就是我们查询区间的时候区间的两个端点减去一个\(x[i]\)就行了。

但是这样我们查询的可能不是树上的一个节点了,我们在树上二分的时候每一次都要调用一次查询的函数。

复杂度多一个\(log\)可以接受。

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=250000;
int n,m,tot,sum[N*30],ch[N*30][2],root[N];
void build(int l,int r,int &now){
now=++tot;
if(l==r)return;
int mid=(l+r)>>1;
build(l,mid,ch[now][0]);
build(mid+1,r,ch[now][1]);
}
void ins(int l,int r,int x,int pre,int &now){
now=++tot;
sum[now]=sum[pre]+1;
if(l==r)return;
int mid=(l+r)>>1;
ch[now][1]=ch[pre][1];
ch[now][0]=ch[pre][0];
if(x>mid)ins(mid+1,r,x,ch[pre][1],ch[now][1]);
else ins(l,mid,x,ch[pre][0],ch[now][0]);
}
int getsum(int l,int r,int L,int R,int pre,int now){
if(L>R)return 0;
if(l==L&&r==R){
return sum[now]-sum[pre];
}
int mid=(l+r)>>1;
if(L>mid)return getsum(mid+1,r,L,R,ch[pre][1],ch[now][1]);
else if(R<=mid)return getsum(l,mid,L,R,ch[pre][0],ch[now][0]);
else return getsum(l,mid,L,mid,ch[pre][0],ch[now][0])+
getsum(mid+1,r,mid+1,R,ch[pre][1],ch[now][1]);
}
int check(int x,int y,int pre,int now){
int ans=0;
for(int i=17;i>=0;i--){
int t=ans+((1^((x>>i)&1))<<i);
if (getsum(0,99999,max(0,t-y),min(t+(1<<i)-1-y,99999),pre,now))ans=t;
else ans+=((x>>i)&1)<<i;
}
return ans;
}
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int main(){
n=read();m=read();
build(0,99999,root[0]);
for(int i=1;i<=n;i++){
int a=read();
ins(0,99999,a,root[i-1],root[i]);
}
while(m--){
int b=read(),x=read(),l=read(),r=read();
printf("%d\n",check(b,x,root[l-1],root[r])^b);
}
return 0;
}

[SCOI2016]美味(可持久化线段树)的更多相关文章

  1. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  2. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  3. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

  4. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  5. 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树

    3653: 谈笑风生 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 628  Solved: 245[Submit][Status][Discuss] ...

  6. 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树

    没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...

  7. 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

    看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...

  8. 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之

    最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...

  9. 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树

    为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...

随机推荐

  1. hdu 1240(三维广搜)

    题意: 有一个n*n*n的三维空间. 给你起始坐标和终点坐标.要你从起点到终点,问最少需要多少步走出去.如果走不出去则输出"NO ROUTE". 空间中 'O' 表示这个点可以走, ...

  2. 工作流Activiti学习地址

    http://blog.csdn.net/xnf1991/article/details/52610277

  3. GitHub两种上传方式的对比----SSH / https

    https://www.jianshu.com/p/1ac06bcd8ab5 https://www.cnblogs.com/lqfxyy/p/5740720.html https://blog.cs ...

  4. HDU1027 Ignatius and the Princess II( 逆康托展开 )

    链接:传送门 题意:给出一个 n ,求 1 - n 全排列的第 m 个排列情况 思路:经典逆康托展开,需要注意的时要在原来逆康托展开的模板上改动一些地方. 分析:已知 1 <= M <= ...

  5. [USACO18OPEN] Multiplayer Moo (并查集+维护并查集技巧)

    题目大意:给你一个N*N的棋盘,棋盘上每个点都有一个权值 第一问求一个权值形成的最大联通块中点的数量 第一问求两个权值共同形成的最大联通块中点的数量 提供一种并查集的做法:(感谢大佬们的题解)第一问把 ...

  6. vue如何根据返回的值对元素进行样式渲染

    1.最终显示样式: 需要:根据任务状态值,显示不同颜色的原点表示任务状态,以及对优先级的数据,进行☆标记 2.代码实现: 在<el-table-column>中需要显示的内容前面,添加图标 ...

  7. RabbitMQ消息可靠性分析 - 简书

    原文:RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就 ...

  8. Vue基础知识点

    基础知识: vue的生命周期: beforeCreate/created.beforeMount/mounted.beforeUpdate/updated.beforeDestory/destorye ...

  9. SQL SERVER-安装和卸载

    卸载后无法正常安装SQL SERVER 删除了本机的SQL SERVER以后,我发现我本机的SQL SERVER 再也安装不上了,这个一个比较严重的问题,要每天定时备份数据库到指定的地方才能防止数据丢 ...

  10. java 基础概念 -- 数组与内存控制

    问题1: Java在声明数组的过程中,是怎样分配内存的? 在栈内存中 建一个数组变量,再在堆内存中 建一个 数组对象.至于详细的内存分配细节,还得看 该初始化是 数组动态初始化 还是 数组静态初始化. ...