【BZOJ 4571】【SCOI 2016】美味
http://www.lydsy.com/JudgeOnline/problem.php?id=4571
这道题因为有加法,不能像可持久化trie那样每次判断只判断一个子树,而是在主席树上查询\(\log n\)个子树。
从高位到低位依次确定\(a_j+x_i\)的二进制位。
注意\(a_j+x_i\)不是\(10^5\)级别的,是两倍大小。
时间复杂度\(O(n\log n+m\log^2n)\)。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 200003;
struct node {
	int s, l, r;
} T[N * 20];
int cnt = 0, root[N], n, m;
void update(int &pos, int l, int r, int key) {
	T[++cnt] = T[pos]; pos = cnt; ++T[pos].s;
	if (l == r) return;
	int mid = (l + r) >> 1;
	if (key <= mid) update(T[pos].l, l, mid, key);
	else update(T[pos].r, mid + 1, r, key);
}
int Q(int TL, int TR, int l, int r, int L, int R) {
	if (L <= l && r <= R) return T[TR].s - T[TL].s;
	if (T[TR].s - T[TL].s == 0) return 0;
	int mid = (l + r) >> 1, s = 0;
	if (L <= mid) s += Q(T[TL].l, T[TR].l, l, mid, L, R);
	if (R > mid) s += Q(T[TL].r, T[TR].r, mid + 1, r, L, R);
	return s;
}
void solve(int b, int x, int TL, int TR) {
	int v, num = 0, numl, numr;
	for (int i = 17; i >= 0; --i) {
		v = (b >> i) & 1 ^ 1;
		numl = num | (v << i); numr = numl | (1 << i) - 1;
		if (Q(TL, TR, 0, 99999, numl - x, numr - x))
			num |= (v << i);
		else
			num |= ((v ^ 1) << i);
	}
	printf("%d\n", num ^ b);
}
int main() {
	scanf("%d%d", &n, &m);
	int ai;
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &ai);
		root[i] = root[i - 1];
		update(root[i], 0, 99999, ai);
	}
	int bi, xi, l, r;
	for (int i = 1; i <= m; ++i) {
		scanf("%d%d%d%d", &bi, &xi, &l, &r);
		solve(bi, xi, root[l - 1], root[r]);
	}
	return 0;
}
【BZOJ 4571】【SCOI 2016】美味的更多相关文章
- [SCOI 2016]美味
		Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) . \(m\) 组询问 \((b,x,l,r)\) 询问 \[\max_{i=l}^r b\oplus (A_i+x) ... 
- bzoj 4568 [SCOI 2016] 幸运数字
		题目大意 给定一棵\(n\)个点的树,每个点有权值 \(q\)次询问树上路径中 每个点权值可选可不选的最大异或和 \(n\le 2*10^4,q\le 2*10^5,val[i]\le 2^{60}\ ... 
- BZOJ 4571: [Scoi2016]美味
		二次联通门 : BZOJ 4571: [Scoi2016]美味 /* BZOJ 4571: [Scoi2016]美味 dalao们都在说这题如果没有加法balabala就可以用可持久化trie解决了 ... 
- [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分
		[LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ... 
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
		[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ... 
- SCOI 2016 萌萌哒
		SCOI 2016 萌萌哒 solution 有点线段树的味道,但是并不是用线段树来做,而是用到另外一个区间修改和查询的利器--ST表 我们可以将一个点拆成\(logN\)个点,分别代表从点\(i\) ... 
- 【BZOJ 4568】【SCOI 2016】幸运数字
		写了一天啊,调了好久,对拍了无数次都拍不出错来(数据生成器太弱了没办法啊). 错误1:把线性基存成结构体,并作为函数计算,最后赋值给调用函数的变量时无疑加大了计算量导致TLE 错误2:像这种函数(A, ... 
- bzoj 4571: [Scoi2016]美味 (主席树)
		链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 题面; 4571: [Scoi2016]美味 Time Limit: 30 Sec ... 
- BZOJ 4571 美味
		又一部SCOI血泪史.... 唉. 就是在这棵树上一遍又一遍跑嘛. 以后不要直接求答案啊.要最后再异或起来. 要学习简单的代码风格. #include<iostream> #include ... 
随机推荐
- 父元素与子元素之间的margin-top问题(css hack)
			hack: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. hytml代码: &l ... 
- Ribbon/Feign/Zuul retry
			原文 https://github.com/spring-cloud/spring-cloud-netflix/issues/1577 I'm using Spring Cloud Camden SR ... 
- 今天安装了arch,感觉不错,这速度可以
			虽然没有想想中的那么那么快,不过已经可以了 总结一下遇到的问题以及i自己安装的软件 1.u盘硬盘不能自动挂载 安装gvfs 2.不能读写挂载 安装ntfs-3g 3.时间不对 照wiki上的说 #ln ... 
- Tomcat8配置默认项目
			<!-- 配置默认访问项目 --> <Host name="localhost" appBase="webapps" unpackWARs=& ... 
- bisai.py
			比赛专用py #!/usr/etc/env python #encoding:utf-8 #by i3ekr #token import re,os,requests res = "(fla ... 
- 【Windows使用笔记】Windows科研软件
			1 Anaconda Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.主要是内置有jupyter notebook和jupyter ... 
- Sql Server 2014/2012/2008/2005 数据库还原出现 3154错误的解决办法
			在Sql Server 数据库还原出现 3154错误 解决方法1:不要在数据库名字上点右键选择还原,而要是在根目录“数据库”三个字上点右键选择还原,然后再选择数据库,问题便可以解决,如果不行参照方法 ... 
- 微信小程序滚动条返回顶部
			scroll-view(可滚动视图区域): 使用竖向滚动时,需要给<scroll-view/>一个固定高度,通过 WXSS 设置 height,将scroll-y属性设置为true,将en ... 
- android dialog 筛选列表
			1.效果图 2. 布局文件 1)显示筛选的标题 <?xml version="1.0" encoding="utf-8"?> <LinearL ... 
- 对list对象进行排序
			List<LjlSevOrdersVO> list = ljlSevOrdersService.findSevForOrders(ljlSevOrdersVO); //查出所有是自愿者的订 ... 
