[SCOI2016]美味(可持久化线段树)
可持久化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]美味(可持久化线段树)的更多相关文章
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
		
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
 - 【BZOJ-3673&3674】可持久化并查集       可持久化线段树 + 并查集
		
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
 - 【BZOJ-2653】middle      可持久化线段树 + 二分
		
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
 - HDU 4866 Shooting(持久化线段树)
		
view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...
 - 【BZOJ-3653】谈笑风生       DFS序 + 可持久化线段树
		
3653: 谈笑风生 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 628 Solved: 245[Submit][Status][Discuss] ...
 - 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky  可持久化线段树
		
没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...
 - 【BZOJ3207】花神的嘲讽计划I  可持久化线段树/莫队
		
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
 - 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky   用可持久化线段树破之
		
最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...
 - 【BZOJ 3524】【Poi2014】Couriers  可持久化线段树
		
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...
 
随机推荐
- Python多线程原理与实现
			
Date: 2019-06-04 Author: Sun Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了解线程池的使用 1 线程基本 ...
 - JS判断客户端是否是iOS或者Android或者ipad(一)
			
通过判断浏览器的userAgent,用正则来判断是否是ios和Android客户端.代码如下<script type="text/javascript"> var u ...
 - spring的JdbcTemplate
			
一.首先配置JdbcTemplate: 要使用Jdbctemplate 对象来完成jdbc 操作.通常情况下,有三种种方式得到JdbcTemplate 对象. 第一种方式:我们可以在自己定 ...
 - 路飞学城Python-Day40(第四模块复习题)
			
数据库 一.简答题 1.说说你所知道的MySQL数据库存储引擎,InnoDB存储引擎和MyISM存储引擎的区别? 1.InnoDB存储引擎(MySQL默认存储引擎),支持事务,其设计目标主要面向联机事 ...
 - sklearn学习3----模型选择和评估(1)训练集和测试集的切分
			
来自链接:https://blog.csdn.net/zahuopuboss/article/details/54948181 1.sklearn.model_selection.train_test ...
 - frp(升级版)教程
			
注:之前的教程是按照官网文档亲自实践操作汇总而成的,所需的软件也是从官网下载的. 但是有一个问题,若是运行在有公网IP的frps程序被其他人所知道,他们就可以直接在他们电脑上运行frpc客户端, 简而 ...
 - 升级ruby到2.0
			
本文部分内容转载,如侵犯个人利益请联系博客管理员及时删除,或留言之评论区 一.安装库 Yum install –y gcc* openssl* wget 二.安装ruby wget https://c ...
 - 用pycharm运行django项目
			
[点击]run -> Edit Configrations 弹出如下页面 点击“+” 点击Django server 在弹出页面的host填0.0.0.0 点击这个“文件夹” 点击‘+’后填下面 ...
 - 通过wget下载jdk
			
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-co ...
 - ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)
			
功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中.Excel的多个Sheet对应页面的多个Tab选项卡.转换算法的难点在于,如何处理行列合并,将Exc ...