正经题解|狒狒食肆
2024-09-02 11:42:26
发布于:浙江
52阅读
0回复
0点赞
题目大意
给出一个序列进行次提问,每次会提问一个区间,求解区间按照给定规则计算的最大值与最小值为多少。
解题思路
设为获取字符的二进制最低位1码权,可得等价公式
- :
- :
一个区间当中,我们根据不同数字的作为划分种类的阶层,那么假设存在的阶层,且的最小值为,设该阶层的序列为,其中每个元素都满足,那么对于每个问答的解题过程如下:
- :
- : $answer_max = max(z | A^{B-1}_B) $ , 。
注:即为从B序列当中拿取个数字进行全排列。
时间复杂度
代码示范
#include<bits/stdc++.h>
using namespace std;
int n,q,a[100005],b[100005];
int lowbit(int x)
{
return x & -x;
}
int main()
{
cin >> n >> q;
for(int i = 1 ; i <= n ; i ++ )cin >> a[i];
while(q--)
{
int l,r;
cin >> l >> r ;
int mi_2 = INT_MAX;
for(int i = l ; i <= r ; i ++ ){
mi_2 = min(mi_2,lowbit(a[i]));
}
vector<int> ve;
for(int i = l ; i <= r ; i ++ )
{
if(lowbit(a[i]) == mi_2)ve.push_back(i);
}
int answer = 0 ;
if(ve.size() == r - l + 1)
{
for(int i = l ; i <= r ; i ++ )answer |= a[i];
cout << answer << " " << answer << endl;
}else{
for(auto i : ve)
{
int temp = mi_2;
for(auto j : ve){
if(i == j)continue;
temp |= a[j];
}
answer = max(answer , temp);
}
cout << answer << " " << mi_2 << endl;
}
}
return 0;
}
全部评论 1
我嘞个自作自A啊【doge】
2024-09-02 来自 北京
0
有帮助,赞一个