首页 > 其他分享 >P3293 [SCOI2016] 美味

P3293 [SCOI2016] 美味

时间:2024-04-25 13:33:41浏览次数:22  
标签:struct int tr P3293 add ret rm SCOI2016 美味

经典题,\(\rm 01Trie\) 和 主席树的结合。

考虑一个没有偏移量的时候如何计算,其实就是一个裸的可持久化 \(\rm Trie\)。

但是有了偏移量就不一样了,这会导致直接改变 \(\rm Trie\) 的结构,十分不好做。

套路的逐位考虑,从高位枚举到低位。假设当前找到的数为 \(\rm ret\),考虑到 \(i\) 位,则不难发现可以选择的值域区间为 \([ret - add, ret + 2 ^ {i + 1} - add]\)。其中前 \(2^i\) 个数 \(i\) 位为 \(0\) , 剩余为 \(1\).

由 \(\rm 01Trie\) 的思想,我们尽量往反向走,那么我们只需要查找反向区间中是否有数字,使用主席树即可。

code:

#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int N = 2e5 + 10, M = 1e5;

struct Persist_Seg{
	#define mid (l + r >> 1)
	struct node{
		int ls, rs, sum;
	}hjt[N << 5];
	int root[N], cnt;
	void pushup(int o){hjt[o].sum = hjt[hjt[o].ls].sum + hjt[hjt[o].rs].sum;}	
	void add(int l, int r, int pre, int& now, int x){
		hjt[++cnt] = hjt[pre]; now = cnt;
		if(l == r){hjt[now].sum++; return;}
		if(x <= mid) add(l, mid, hjt[pre].ls, hjt[now].ls, x);
		else add(mid + 1, r, hjt[pre].rs, hjt[now].rs, x);
		pushup(now);
	}
	bool check(int l, int r, int Lo, int Ro, int s, int t){
		if(l > r) return false;
 		if(s <= l && r <= t) return hjt[Ro].sum - hjt[Lo].sum;
		bool ret = false;
		if(s <= mid) ret |= check(l, mid, hjt[Lo].ls, hjt[Ro].ls, s, t);
		if(mid < t) ret |= check(mid + 1, r, hjt[Lo].rs, hjt[Ro].rs, s, t);
		return ret; 
	}
}tr;

int n, m;

int solve(int pivot, int ad, int l, int r){
	int ret = 0;
	for(int i = 20; i >= 0; i--){
		int c = pivot & (1 << i);
		if(c && !tr.check(0, M, tr.root[l - 1], tr.root[r], ret - ad, ret - ad + (1 << i) - 1)) ret += (1 << i);
		else if(!c && tr.check(0, M, tr.root[l - 1], tr.root[r], ret - ad + (1 << i), ret - ad + (1 << i + 1) - 1)) ret += (1 << i); 
	}
	return ret ^ pivot;
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		int x; cin >> x;
		tr.add(0, M, tr.root[i - 1], tr.root[i], x);
	}
	for(int i = 1; i <= m; i++){
		int b, x, l, r;
		cin >> b >> x >> l >> r;
		cout << solve(b, x, l, r) << "\n";
	}
	
	return 0;
}

标签:struct,int,tr,P3293,add,ret,rm,SCOI2016,美味
From: https://www.cnblogs.com/little-corn/p/18157527

相关文章

  • P3295 [SCOI2016] 萌萌哒(倍增并查集)
    题意简述有一个长为\(n\)的数字序列\(s\),有\(q\)组限制\(l_1,r_1,l_2,r_2\)形如\(s_{l_1,\cdots,r_1}=s_{l_2\cdots,r_2}\),求满足所有限制的\(s\)的方案数,数字序列不能有前导0。\(n,q\le10^5\),保证\([l_1,r_1]\)和\([l_2,r_2]\)大小相等。分析字符之间的等量......
  • abc160E 吃苹果能得到的最大美味度
    有A个红苹果,美味度分别为p[i];有B个青苹果,美味度分别为q[i];另外还有C个无色苹果,美味度分别为r[i],无色苹果在吃之前可以涂成红色或青色。现在要吃X个红苹果和Y个青苹果,求能吃到的最大美味度。1<=X<=A<=1E5;1<=Y<=B<=1E5;1<=C<=1E5;1<=p[i],q[i],r[i]<=1E9反悔贪心,先不考虑无色......
  • 【题解 P3293】 美味
    [SCOI2016]美味题目描述一家餐厅有\(n\)道菜,编号\(1,2,\ldots,n\),大家对第\(i\)道菜的评价值为\(a_i\)。有\(m\)位顾客,第\(i\)位顾客的期望值为\(b_i\),而他的偏好值为\(x_i\)。因此,第\(i\)位顾客认为第\(j\)道菜的美味度为\(b_i\oplus(a_j+x_i)\),\(\opl......
  • 用源码烹饪美味:同城上门做饭APP技术实践全揭秘
    同城上门做饭APP为用户提供了更为个性化的美食体验。这篇文章,小编将与大家深入揭秘同城上门做饭APP的技术实践,探讨其背后的技术原理与实际开发中的关键挑战。 一、技术架构同城上门做饭APP的技术架构至关重要。在前端,采用先进的移动应用框架,确保用户在不同设备上都能流畅使用。而......
  • 团聚美味:打造完美火锅聚餐
    美味火锅:快速准备与愉快用餐引言准备一顿美味的火锅聚餐需要仔细策划和高效的组织。在这篇博客中,我们将讨论从购物清单、提前准备、人员协作到火锅方案等各个方面的建议,同时考虑到特殊情况。购物清单主食建议:肉类:约500克牛肉片、300克羊肉片、300克鸡肉片等。海鲜:约400克鲜......
  • 美味佳肴
    美味佳肴思路:一个01背包,但是要先按照贡献度对\(m\)道菜排序,因为贡献值随时间变化而变化,应该在率先更新贡献值最大的菜的前提下来更新接下来的菜状态转移方程:\(f(j)=\max(f(j),f(j-c_i)+a_i-b_i*j)\)关键代码:#include<bits/stdc++.h>usingi64=longlong......
  • 每日总结|9.17-别为打翻的牛奶哭泣,今天你能拥有更美味的果汁
    超级喜欢两首歌:越来越不懂-蔡健雅你不明白-Joysaaaa今天没干什么其实,都是一些不太费脑子的。休息了,恢复精力,下周才能元气满满啊!1、王老师的需求文档作业,做了一部分,查一些资料2、看学习视频3、人月神话,今天看了不到两章(我本来还说要每天看一点呢,结果还是比较忙的)4、c#(......
  • 洛谷 P3291 [SCOI2016] 妖怪
    设每只怪物经过环境影响后的攻击力和防守力分别为\(x_i,y_i\),则有:\(y_i=dnf_i-\dfracba(x_i-atk_i)\)。设\(k=-\dfracba\),则有\(y_i=kx_i+dnf_i-k\cdotatk_i\)。设直线\(l_i:y_i=kx_i+dnf_i-k\cdotatk_i\),第\(i\)只怪物在\((a,b)\)的环境下......
  • 请享用美味的快速幂算法-通俗易懂版
    一、算法整体思路第1步按照最直接、最好理解的方式看,2的n次幂是n个2相乘,即有如下公式例如:第2步然而为了节省大量时间,通过简单的思考和严格数学推理,我们不难理解以下结论: 1.偶数幂的情况:通过幂函数运算法则,有2n=(2n/2)2,即有如下等式:例如24......
  • L27_用日语询问最美味的食物是什么
    语料的视频观看地址概述日语中询问从几样东西选哪个好,可以用:どれが一番~か的句式,比如どれが一番美味しいですか哪个最好吃どれが一番有名ですか哪个最有名どれが一番安いですか?哪个最便宜动画会话ご注文は?需要点什么?タムさん、何にする?Tam,你想吃什么?どれ......