可持久化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. Python 进行网络编程

    Date: 2019-06-10 Author: Sun 1. Python TCP通信实现 socket()函数 Python 中,我们用 socket()函数来创建套接字,语法格式如下: sock ...

  2. div基本组成要素

    title下面先清除固有格式 style{ *{ margin:0 auto padding:0 foant family } } div{ width height border backgroun ...

  3. arttemplate模板引擎里面多层循环

    要使用支持原生js的插件: 代码截图: json数据 { "list": [ { "name": "学历层次", "item&qu ...

  4. 多进程Socket_Server

    import socketserverclass MyServer(socketserver.BaseRequestHandler): def handle(self): #继承BaseRequest ...

  5. node——文件写入,文件读取

    ru //实行文件操作 //文件写入 //1.加载文件操作,fs模块 var fs = require('fs'); //2.实现文件写入操作 var msg='Hello world'; //调用f ...

  6. 【XSY2692】杨柳 - 网络流

    题目来源:2018冬令营模拟测试赛(十) 题解: 继续鬼畜网络流…… 首先这题有个显然的做法:bfs预处理出每个起点到每个终点的最短步数,然后直接建边加超级源汇跑费用流即可: 但是这样边数是$n^2$ ...

  7. JavaFX 的 UI 控件集 ControlsFX

    出处:http://www.oschina.net/p/controlsfx JavaFX 的 UI 控件集 ControlsFX ControlsFX 开源项目旨在为 JavaFX 开发提供更多的 ...

  8. 如何成为资深的python专家

    相信很多人有这种感受,python很简单,几天就学会了:做了一段时间就觉得python没什么好玩的,就这样. 一种语言有火这么久,必有它存在的道理. 第一.我们要相信她,她就像你的新女朋友一样,她会给 ...

  9. HDU 2841

    明显,当(X,Y)=1时,是可以看见的. 这题,记得POJ 上也有类似的一题... 不过比较奇怪的是,我以为会超时,因为范围达到了100000,但竟然直接枚举没超时.... #include < ...

  10. 输入password登录到主界面,录入学生编号,排序后输出

    n 题目:输入password登录到主界面,录入学生编号,排序后输出 n 1.  语言和环境 A.实现语言 C语言 B.环境要求 VC++ 6.0 n 2.  要求 请编写一个C语言程序.将若干学生编 ...