P3293-[SCOI2016]美味【主席树】

正题

题目链接:https://www.luogu.com.cn/problem/P3293


题目大意

给出一个长度为nnn的序列,mmm次询问给出b,x,l,rb,x,l,rb,x,l,r表示询问在[l,r][l,r][l,r]中找到一个数字aaa使得bxor(a+x)b\ xor\ (a+x)b xor (a+x)的值最大。

1≤n,m≤2×105,0≤a,b,x<1051\leq n,m\leq 2\times10^5,0\leq a,b,x<10^51n,m2×105,0a,b,x<105


解题思路

TrieTrieTrie上想就很容易卡思路,考虑正常情况下我们是怎么求bxorab\ xor\ ab xor a最大的。

其实在TrieTrieTrie树上条等价于每次询问一个区间内有没有值然后再选择往左或者往右,现在这个xxx就是相当于把我们询问的区间移动了,既然TrieTrieTrie树解决不了这样的问题那么就考虑一下主席树。

定义一下zzz表示异或的那个数的基数(前面枚举的位已经确定),从大到小枚举iii,若bbb的第iii位有那么最好是让a+xa+xa+x的第iii位没有,也就是询问[z−x,z−x+2i)[z-x,z-x+2^i)[zx,zx+2i)。如果第iii位没有那么最好是a+xa+xa+x的第iii位有,那么询问[z−x+2i,z−x+2i+1)[z-x+2^i,z-x+2^{i+1})[zx+2i,zx+2i+1)就好了。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10,M=N<<5,Li=1e5;
int n,m,cnt,rt[N],w[M],ls[M],rs[M];
int Change(int x,int L,int R,int pos){int now=++cnt;w[now]=w[x]+1;if(L==R)return now;int mid=(L+R)>>1;if(pos<=mid)ls[now]=Change(ls[x],L,mid,pos),rs[now]=rs[x];else rs[now]=Change(rs[x],mid+1,R,pos),ls[now]=ls[x];return now;
}
int Ask(int x,int y,int L,int R,int l,int r){if(!(w[y]-w[x]))return 0;if(L==l&&R==r)return w[y]-w[x];int mid=(L+R)>>1;if(r<=mid)return Ask(ls[x],ls[y],L,mid,l,r);if(l>mid)return Ask(rs[x],rs[y],mid+1,R,l,r);return Ask(ls[x],ls[y],L,mid,l,mid)+Ask(rs[x],rs[y],mid+1,R,mid+1,r);
}
int Query(int L,int R,int l,int r){if(l<0)l=0;if(r>Li)r=Li;if(r<l)return 0;return Ask(rt[L-1],rt[R],0,Li,l,r);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int x;scanf("%d",&x);rt[i]=Change(rt[i-1],0,Li,x);}while(m--){int b,a,l,r,z=0,ans=0;scanf("%d%d%d%d",&b,&a,&l,&r);for(int i=17;i>=0;i--){if((b>>i)&1){if(Query(l,r,z-a,z-a+(1<<i)-1))ans|=(1<<i);else z|=(1<<i);}else{if(Query(l,r,z-a+(1<<i),z-a+(1<<i+1)-1))ans|=(1<<i),z|=(1<<i);}}printf("%d\n",ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题霸 [三个数的最大乘积]C++题解/答案

牛客题霸 [三个数的最大乘积]C题解/答案 题目描述 给定一个无序数组&#xff0c;包含正数、负数和0&#xff0c;要求从中找出3个数的乘积&#xff0c;使得乘积最大&#xff0c;要求时间复杂度&#xff1a;O(n)&#xff0c;空间复杂度&#xff1a;O(1)。 题解&#xff1a; 有…

震惊!温州一程序员编完八皇后吐血而亡,他的代码是什么样子?!!

解析 经典大法师&#xff08;dfs哈哈哈&#xff09; 比较关键的是每条对角线上点的坐标之和或差是相同的&#xff0c;故可以用一维数组存储其状态 这题一开始用了双层循环&#xff0c;卡掉了4个点qwq 后来发现其实因为每行只有一个皇后&#xff0c;每次单层循环枚举j就可以实…

codeforces1498 D. Bananas in a Microwave(背包+优化)

D. Bananas in a Microwave issue是fw题解 设计dp&#xff1a; 状态表示&#xff1a;fi,jf_{i,j}fi,j​表示&#xff1a;前iii个操作是否能够凑成jjj。 状态转移&#xff1a;第iii次操作枚举操作次数考虑是否凑成val\text{val}val&#xff0c;如果第i−1i-1i−1次操作也可以凑…

直播视频发布:Windows上的Linux容器和Azure混合云中的Kubernetes(k8s)

如果你还没有开始关注容器&#xff0c;那么你已经out了&#xff1b;如果你还在单机上运行容器&#xff0c;那么你out了。经过2013到2018年5年的演化&#xff0c;分化和进化&#xff1b;容器&#xff0c;Docker和Kubernetes已经是任何一家企业的IT解决方案都不能忽视的重要趋势。…

ARC122C-Calculator【乱搞,构造】

正题 题目链接:https://atcoder.jp/contests/arc122/tasks/arc122_c 题目大意 一个数对开始是(0,0)(0,0)(0,0)&#xff0c;每次可以选择一个数加一或者让一个数加上另一个数&#xff0c;求使得第一个数变成nnn的方案。步数不超过130130130。 1≤n≤10181\leq n\leq 10^{18}1≤…

牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案

牛客题霸 [将升序数组转化为平衡二叉搜索树]C题解/答案 题目描述 给出一个升序排序的数组&#xff0c;将其转化为平衡二叉搜索树&#xff08;BST&#xff09;. 题解&#xff1a; 二叉搜索树的定义&#xff1a; 二叉搜索树或者是一棵空树&#xff0c;或者是具有下列性质的二…

日志:贪心

排队接水 时间限制: 1 Sec 内存限制: 128 MB 题目描述 有n 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为ti &#xff0c;请编程找出这n 个人 排队的一种顺序&#xff0c;使得n 个人的平均等待时间最小。 输入 第一行为n(1<n<5000)。第二行分别表示第1…

2021“MINIEYE杯”中国大学生算法设计超级联赛(1)zoto(二维数颜色)

zoto Code1 树状数组套动态开点权值线段树 效仿HH的项链&#xff0c;维护右端点&#xff0c;询问需要排序 #include<bits/stdc.h> using namespace std; template <class Tint> T rd() {T res0;char chgetchar();while(!isdigit(ch)) chgetchar();while( isdigi…

通过Microsoft Learn进行学习以提升技能

通过 Microsoft Learn&#xff0c;可以免费而且轻松有趣地学习 Microsoft 技术。Microsoft Learn的与众不同借助 Microsoft Learn&#xff0c;任何人都能按自己的学习计划和速度掌握重要的知识和概念。 使用者将能够访问培训资料、代码示例&#xff0c;以及免费试用产品。无论是…

牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11174/F 题目大意 给出n,kn,kn,k求 ∑i11n∑i21n...∑ik1ngcd(fi1,fi2,...,fik)\sum_{i_11}^n\sum_{i_21}^n...\sum_{i_k1}^ngcd(f_{i_1},f_{i_2},...,f_{i_{k}})i1​1∑n​i2​1∑n​...ik​1∑n​gcd(fi1​​,fi2​​,.…

牛客题霸 [旋转字符串]C++题解/答案

牛客题霸 [旋转字符串]C题解/答案 题目描述 字符串旋转: 给定两字符串A和B&#xff0c;如果能将A从中间某个位置分割为左右两部分字符串&#xff08;都不为空串&#xff09;&#xff0c;并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。 例如…

震惊!递推与递归竟然可以这么编!%99的程序员都不知道!

四、归并排序&#xff08;逆序对&#xff09; (一)、归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b; 即先使…

asp.net core webApi 参数保护

Introasp.net core data protection 扩展&#xff0c;基于 IDataProtector 扩展的数据保护组件&#xff0c;自动化的实现某些参数的保护ParamsProtectionParamsProtection 是为了保护 asp.net core webapi 项目的某些参数而设计的&#xff0c;也可以用来做一定程度上的反爬虫。…

2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数)

J-Product of GCDs Code1 对于每个质数以及每个质数的次幂单独考虑他们的贡献&#xff0c;由于多次使用快速幂导致TLE #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!is…

AT2390-[AGC016F]Games on DAG【状压dp,SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/AT2390 解题思路 nnn个点的DAGDAGDAG&#xff0c;mmm条边可有可无&#xff0c;111和222上有石头。求有多少种方案使得先手必胜。 1≤n≤15,1≤m≤n(n−1)21\leq n\leq 15,1\leq m\leq \frac{n(n-1)}{2}1≤n≤15,1≤m≤2n(n−1…

牛客题霸 [合并两个有序的数组] C++题解/答案

牛客题霸 [合并两个有序的数组] C题解/答案 题目描述 给出两个有序的整数数组 和 &#xff0c;请将数组 合并到数组 中&#xff0c;变成一个有序的数组 注意&#xff1a; 可以假设 数组有足够的空间存放 数组的元素&#xff0c; 和 中初始的元素数目分别为 和 题目描述 给出…

震惊!快速幂怎么编?省一说暴力,银牌说递归,国集听完笑了

国集&#xff1a;打表啊&#xff01;&#xff01; 题目描述 给你三个整数 b,p,kb,p,kb,p,k&#xff0c;求 bp mod kb^p \bmod kbpmodk。 输入格式 输入只有一行三个整数&#xff0c;分别代表 b,p,kb,p,kb,p,k 输出格式 输出一行一个字符串 b^p mod ks&#xff0c;其中 b,…

CF1392G-Omkar and Pies【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1392G 题目大意 两个长度为kkk的起始和目标01串。 nnn个操作交换起始串的两个位置&#xff0c;选择一段长度至少为mmm的连续操作序列使得相同的位数最多。 1≤m≤n≤106,1≤k≤201\leq m\leq n\leq 10^6,1\leq k\leq 201≤…

codeforces1484 B. Restore Modulo(数学)

B. Restore Modulo 忘了当时怎么乱搞的了~ #include<bits/stdc.h>using namespace std; using lllong long;constexpr int N200010;int n; ll a[N],d[N],d0[N]; int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T1;cin>>T;whil…

牛客题霸 [反转字符串] C++题解/答案

牛客题霸 [反转字符串] C题解/答案 题目描述 写出一个程序&#xff0c;接受一个字符串&#xff0c;然后输出该字符串反转后的字符串。&#xff08;字符串长度不超过1000&#xff09; 题解&#xff1a; 有reverse现成的翻转函数&#xff0c;直接套进去就可以 如果不用函数的…