【LG4585】[FJOI2015]火星商店问题
【LG4585】[FJOI2015]火星商店问题
题面
bzoj权限题
\(Notice:\)
关于题面的几个比较坑的地方:
- “一天”不是一个操作,而是有0操作就相当于一天开始了,然后下面的紧跟着的1操作都算这一天的,直到再次出现0操作为止。当然第一个操作可能会是1操作这个时候也算第一天(比如样例……) 
- 0操作是在这个位置添加一个数而不是改成这个数 
- d=0的时候不算这一天 
垃圾题面,害我被坑
题解
显然对于每个人他的可购买商品的时间都是一个区间。
这样我们按照线段树分治的套路在线段树上打一个那个人的标
记。
我们将所有操作离线, 并将修改和询问分开存下来。
对于每一个修改, 我们按照其在线段树上分治, 存下当前区间所
对应的修改序列, 这个过程可以像整体二分那样处理。
将这段区间内的修改建可持久化\(\text{Trie}\), 而且此时这个时间范围内
的询问你是知道的, 直接在\(\text{Trie}\)上查即可。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
inline int gi() {
	register int data = 0, w = 1;
	register char ch = 0;
	while (!isdigit(ch) && ch != '-') ch = getchar();
	if (ch == '-') w = -1, ch = getchar();
	while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
	return w * data;
}
const int MAX_N = 1e5 + 5;
namespace Trie {
	struct Trie { int ch[2], v; } t[MAX_N << 5]; int tot, rt[MAX_N];
	void insert(int &o, int p, int v, int i) {
		o = ++tot, t[o] = t[p], ++t[o].v;
		if (i == -1) return ;
		bool c = (v >> i) & 1;
		insert(t[o].ch[c], t[p].ch[c], v, i - 1);
	}
	int query(int v, int u, int w, int i) {
		if (i == -1) return 0;
	    bool c = (w >> i) & 1;
		int res = t[t[u].ch[c ^ 1]].v - t[t[v].ch[c ^ 1]].v;
		if (res) return query(t[v].ch[c ^ 1], t[u].ch[c ^ 1], w, i - 1) + (1 << i);
		else return query(t[v].ch[c], t[u].ch[c], w, i - 1);
	}
}
struct Mdy { int s, v, t; } q[MAX_N], lq[MAX_N], rq[MAX_N];
bool operator < (const Mdy &l, const Mdy &r) { return l.s < r.s; }
struct Qry { int l, r, tl, tr, v; } p[MAX_N];
int m_cnt, q_cnt;
int N, M, ans[MAX_N];
#define lson (o << 1)
#define rson (o << 1 | 1)
vector<int> vec[MAX_N << 2];
void modify(int o, int l, int r, int ql, int qr, int pos) {
	if (ql > qr) return ;
	if (ql <= l && r <= qr) return (void)vec[o].push_back(pos);
	int mid = (l + r) >> 1;
	if (ql <= mid) modify(lson, l, mid, ql, qr, pos);
	if (qr > mid) modify(rson, mid + 1, r, ql, qr, pos);
}
int stk[MAX_N], top;
void calc(int o, int l, int r) {
	top = Trie::tot = 0;
	for (int i = l; i <= r; i++) {
		stk[++top] = q[i].s;
		Trie::insert(Trie::rt[top], Trie::rt[top - 1], q[i].v, 17);
	}
	for (vector<int>::iterator ite = vec[o].begin(); ite != vec[o].end(); ++ite) {
		int k = *ite;
		int l = upper_bound(&stk[1], &stk[top + 1], p[k].l - 1) - stk - 1;
		int r = upper_bound(&stk[1], &stk[top + 1], p[k].r) - stk - 1;
		ans[k] = max(ans[k], Trie::query(Trie::rt[l], Trie::rt[r], p[k].v, 17));
	}
}
void Div(int o, int lval, int rval, int st, int ed) {
	if (st > ed) return ;
	calc(o, st, ed);
	if (lval == rval) return ;
	int mid = (lval + rval) >> 1, lt = 0, rt = 0;
	for (int i = st; i <= ed; i++)
		if (q[i].t <= mid) lq[++lt] = q[i];
		else rq[++rt] = q[i];
	for (int i = 1; i <= lt; i++) q[st + i - 1] = lq[i];
	for (int i = 1; i <= rt; i++) q[st + lt + i - 1] = rq[i];
	Div(lson, lval, mid, st, st + lt - 1);
	Div(rson, mid + 1, rval, st + lt, ed);
} 
int main () {
	N = gi(), M = gi();
	for (int i = 1; i <= N; i++) Trie::insert(Trie::rt[i], Trie::rt[i - 1], gi(), 17);
	for (int i = 1; i <= M; i++) {
		int op = gi();
		if (op == 0) { int s = gi(), v = gi(); q[++m_cnt] = (Mdy){s, v, m_cnt}; }
		else {
			int l = gi(), r = gi(), v = gi(), d = gi();
			p[++q_cnt] = (Qry){l, r, max(1, m_cnt - d + 1), m_cnt, v};
			ans[q_cnt] = Trie::query(Trie::rt[l - 1], Trie::rt[r], v, 17);
		}
	}
	for (int i = 1; i <= q_cnt; i++) modify(1, 1, m_cnt, p[i].tl, p[i].tr, i);
	sort(&q[1], &q[m_cnt + 1]);
	Div(1, 1, m_cnt, 1, m_cnt);
	for (int i = 1; i <= q_cnt; i++) printf("%d\n", ans[i]);
	return 0;
}
【LG4585】[FJOI2015]火星商店问题的更多相关文章
- [FJOI2015]火星商店问题
		[FJOI2015]火星商店问题 神仙线段树分治...不过我不会. 这题用线段树套可持久化Trie还是能写的. 常数有点大,洛谷垫底水平. // luogu-judger-enable-o2 #inc ... 
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
		P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ... 
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
		[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ... 
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
		[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ... 
- [FJOI2015]火星商店问题(分治+可持久化)
		题目描述 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能与已 ... 
- BZOJ4137 & 洛谷4585:[FJOI2015]火星商店问题
		https://www.lydsy.com/JudgeOnline/problem.php?id=4137 https://www.luogu.org/problemnew/show/P4585 火星 ... 
- 【bzoj4137】[FJOI2015]火星商店问题
		*题目描述: 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能 ... 
- [洛谷P4585] [FJOI2015] 火星商店问题
		Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ... 
- 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
		传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ... 
随机推荐
- Django重定向的写法、与直接渲染的区别
			Django重定向的写法.与直接渲染的区别 return redirect (“login”) #重定向到login页面,状态码是302页面重定向和直接渲染新的页面的区别.重定向实际是指向了另 ... 
- ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
			转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281366.html ValueError: All strings must be XML compati ... 
- 30、springboot与检索(2)
			项目中进行整合: 1.整合 新建项目加入依赖(NoSql) springboot默认使用SpringDate ElasticSearch模块进行操作 查看自动配置类: SpringBoot默认支持 ... 
- iOS获取当前连接的wifi信息
			导入框架CaptiveNetwork #import <SystemConfiguration/CaptiveNetwork.h> 获取当前连接的wifi信息 // 只能获取当前的SSID ... 
- 关于"XML 文档(2, 2)中有错误:不应有 <xml xmlns=''>"错误
			XML文件名 <?xml version="1.0" encoding="utf-8"?> <Config xmlns:xsi="h ... 
- [LuoguP4711]分子质量(小模拟+玛丽题)
			--这个题我居然可以把他\(1A\)--真是让我不知其可\(qwq\) \(Link\) \(emmmm\)好像发现了什么固定的套路(?)-- 大概就是这种题总会有 1.读入数 方案:快读即可. 2. ... 
- 调试libRTMP代码来分析RTMP协议
			RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,常用在视频直播领域.RTMP协议的默认端口是1935. 学习一个协议 ... 
- 阿里云阿里免费ssl wap网站在手机微信、手机浏览器无法访问
			图片可以访问,样式无法显示 https://css.cnbuses.com/css/wap/gonggong.css 1,怀疑是开了代理访问. 关闭后还是访问空白. 2.在手机浏览器打开,提示该网站的 ... 
- Facade(外观)模式
			1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ... 
- MongoDB常用指令
			db 查看当前操作的数据库 show dbs 显示所有数据库 show collections 显示当前数据库下的所有集合 use database_name 连接到一个名叫[database_nam ... 
