首页 > 其他分享 >【题解 P3293】 美味

【题解 P3293】 美味

时间:2024-01-24 09:03:52浏览次数:23  
标签:le return int 题解 P3293 ++ num 美味

[SCOI2016] 美味

题目描述

一家餐厅有 \(n\) 道菜,编号 \(1, 2, \ldots, n\),大家对第 \(i\) 道菜的评价值为 \(a_i\)。有 \(m\) 位顾客,第 \(i\) 位顾客的期望值为 \(b_i\),而他的偏好值为 \(x_i\)。因此,第 \(i\) 位顾客认为第 \(j\) 道菜的美味度为 \(b_i\oplus (a_j + x_i)\),\(\oplus\) 表示异或运算。

第 \(i\) 位顾客希望从这些菜中挑出他认为最美味的菜,即美味值最大的菜,但由于价格等因素,他只能从第 \(l_i\) 道到第 \(r_i\) 道中选择。请你帮助他们找出最美味的菜。

输入格式

第 \(1\) 行两个整数 \(n, m\),表示菜品数和顾客数。

第 \(2\) 行 \(n\) 个整数 \(a_1, a_2, \ldots, a_n\),表示每道菜的评价值。

第 \(3\) 至 \(m + 2\) 行,每行四个整数 \(b,x,l,r\),表示该位顾客的期望值,偏好值,和可以选择菜品区间。

输出格式

输出 \(m\) 行,每行一个整数表示该位顾客选择的最美味的菜的美味值。

样例 #1

样例输入 #1

4 4
1 2 3 4
1 4 1 4
2 3 2 3
3 2 3 3
4 1 2 4

样例输出 #1

9 
7 
6 
7

提示

对于 \(100\%\) 的数据,满足 \(1 \le n \le 2 \times 10^5\),\(0 \le a_i,b_i,x_i < 10^5\),\(1 \le l_i \le r_i \le n\)(\(1 \le i \le m\)),\(1 \le m \le 10^5\)。

解题思路

包含异或的题目一般都可以从逐位分析的角度解题,这道题也一样。
从高位开始考虑,考虑此位异或后能否为 \(1\) ,那么可选的值的二进制需在 \(....1000000...\) 到 \(....1111111...\) 中间。
设偏好值为 \(v\) ,该位为第 \(i\) 位,已确定的数加上该位的值为 \(x\) ,那么就是找 \(l_i\) 到 \(r_i\) 中存不存在一个数在 \(x-v\) 到 \(x+(1<<i)-1-v\) 之间。
用可持久化线段树即可,总复杂度 \(O(nlog^2n)\) 。
注意主席树要打对。

Code

#include<bits/stdc++.h>
using namespace std;
struct datay
{
	int v,lc,rc;
}a[40000005];
int n,m,d[200005],num,root[200005],rty;
void up(int x)
{
	a[x].v=a[a[x].lc].v+a[a[x].rc].v;
	return;
}
int build(int l,int r)
{
	if(l==r)return (++num);
	int mid=(l+r)>>1,h=++num;
	a[h].lc=build(l,mid);
	a[h].rc=build(mid+1,r);
	return h;
}
int dijah(int x,int l,int r,int k,int v)
{
	if(l==r)
	{
		a[++num]=a[x];
		a[num].v++;
		rty++;
		return num;
	}
	int mid=(l+r)>>1,h=(++num);
	a[h]=a[x];
	if(k<=mid)a[h].lc=dijah(a[x].lc,l,mid,k,v);
	else a[h].rc=dijah(a[x].rc,mid+1,r,k,v);
	up(h);
	return h;
}
int gaia(int x,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		return a[x].v;
	}
	int mid=(l+r)>>1,h=0;
	if(ql<=mid)h+=gaia(a[x].lc,l,mid,ql,qr);
	if(qr>mid)h+=gaia(a[x].rc,mid+1,r,ql,qr);
	return h;
}
int main()
{
	int x,v,l,r,s=0,p,ll,rr,t=0;
	scanf("%d%d",&n,&m);
	root[0]=build(1,400000);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&d[i]),d[i]++,root[i]=dijah(root[i-1],1,400000,d[i],1);
	}
	for(int i=1;i<=m;i++)
	{
		s=0;
		scanf("%d%d%d%d",&x,&v,&l,&r);
		for(int j=17;j>=0;j--)
		{
			p=((1<<j)&x)^(1<<j);
			ll=s+p-v;
			rr=s+p+(1<<j)-1-v;
			if(rr<0)
			{
				if(p==0)
				{
					s+=(1<<j);
					continue;
				}
			}
			if(ll<0)ll=0;
			ll++;
			rr++;
			if(gaia(root[r],1,400000,ll,rr)-gaia(root[l-1],1,400000,ll,rr)>0)s+=p;
			else s+=p^(1<<j);
		}
		printf("%d\n",s^x);
	} 








  return 0;
}

标签:le,return,int,题解,P3293,++,num,美味
From: https://www.cnblogs.com/dijah/p/17983816

相关文章

  • 2024寒假集训 进阶训练赛 (六)部分题解
    A统计单词数题解注意是否是单词。CODECPP#include<iostream>#include<string>#include<algorithm>usingnamespacestd;intmain(){stringword,article;getline(cin,word);getline(cin,article);//转换为小写字母transform(word.beg......
  • Romberg 数值积分算法+P3779 题解(马上写完)
    Romberg算法吊打Simpson的且不玄学(没有什么十五倍)的数值积分算法。缺点是过程复杂一点,但是只体现在证明上,代码很短。铺垫算法梯形求积公式公式\[\int_a^bf(x)dx\approx\frac{(f(a)+f(b))(b-a)}2\\\text{令}(1)=\frac{(f(a)+f(b))(b-a)}2\]计算梯形求积公式的误差......
  • 前端打包后上传至服务器,发现css样式都未生效,查看请求preview预览格式不正确问题解决
    参考:https://blog.csdn.net/wzj_110/article/details/112850811 我的问题前端打包后上传至服务器,发现css样式都未生效,查看css请求,发现preview预览格式不正确,Response-Headers里的Content-type未对应 原因服务器的nginx配置中, mime.types文件缺失。 原理 MIME:Multip......
  • P2627 [USACO11OPEN] Mowing the Lawn G ( [USACO Open11] 修剪草坪/P2034 选择数字 )题
    P2627[USACO11OPEN]MowingtheLawnG搬运工单调队列优化DP简单题,和P2034重了题意:给定一行\(n\)个非负整数\(a_1\cdotsa_n\)。现在你可以选择其中若干个数,但不能有超过\(k\)个连续的数字被选择。你的任务是使得选出的数字的和最大。(直接抄的2034)正着考虑发现很麻烦,......
  • LOJ3990/LG9602 IOI2023 足球场 题解 (区间DP+精简无用状态)
    首先考虑一个足球场长啥样才是合法的。发现一个点能只拐弯一次到达另一个点,可以分为两种情况:先左右走,再上下走或先上下走,后左右走。无论哪种情况,都要求我们走一步使得和目标点一个轴相同,再走一步使得另一个轴也相同,所以加入把每一行选择的格子看成一个区间(因为如果不连续显然是......
  • CF327C Magic Five 题解
    CF327CMagicFive搬运工单调队列优化DP加等比数列求和首先\(5\)的倍数要求末尾是\(0\)或\(5\)所以我们只用看给定字符串的\(0\)和\(5\)就好,我们钦定他是最终的数的末尾。在他之前的选择删掉,在他之后的全部删掉,方案数就是\(2^{pow-1}\),答案累加就可以了。容易想到......
  • P2254 [NOI2005] 瑰丽华尔兹 题解
    P2254[NOI2005]瑰丽华尔兹搬运工单调队列优化DP还是先朴素,设\(f_{t\i\j\d}\)表示在第\(t\)个时刻,在\(i,j\)位置上,上一步是停留还是滑动的最大步数。这个就是四个方向随便转移。\(T_{max}=4*10^4\)这么做肯定不行。发现\(k\)很小,只有\(200\),所以不妨让\(k\)......
  • P2569 [SCOI2010] 股票交易 题解
    P2569[SCOI2010]股票交易搬运工稍微复杂一点的单调队列优化DP直接设\(f_{i\j}\)表示在第\(i\)天,手上还剩\(j\)个股票时的最大收入。容易写出状态转移方程:\(f_{i\j}=max\{f_{k\t}+(t-j)\cdotw\}\),这样不好看,我们可以拆成这样的形式:\[f_{i\j}=max\{f_{k\t}+t\cdo......
  • P4899 [IOI2018] werewolf 狼人 题解
    因为我记忆力不好,经常遇到之前做过的题一下子想不起来,所以打算基本上给每个比较有意思的题写题解,同时造福后代。这是werewolf,它是furry,很可爱题意:一张无向图,点有点权,每次询问从\(u\)到\(v\)的路径中,是否存在一条先走点权大于等于\(L\),再走点权小于等于\(R\)的路径。思路......
  • hugeの张江蔡唐氏模拟赛题解
    晚三huge不让去一机房,说便于管理,我的评价是:唐氏况且二机房没有luogu,改完题后没事干(指写不了狼人),遂写个没人看的题解。T1纯哈希,不写。T2纯tarjan,一直没学,不写。T3比较套路的双指针,赛时降智题意:给定由\(B\)和\(R\)组成的字符串,环形结构,每次可以交换相邻,问最少多少次可以......