首页 > 其他分享 >[题解]CF1878E Iva & Pav

[题解]CF1878E Iva & Pav

时间:2023-09-27 18:44:51浏览次数:28  
标签:Iva Pav int 题解 mid read while num bit

CF 是没题考了吧,每场都出二进制拆位。

思路

首先我们可以二分 \(r\),因为 \(r\) 越大,按位与一定只会小于等于 \(r\) 小的情况。

那么,我们可以用 \(num_{i,j}\) 记录 \(a_j\) 第 \(i\) 位的二进制情况。

如果我们对 \(num_{i,j}\) 做一个前缀和,如果 \(num_{i,r} - num_{i,l - 1} = r - l + 1\),说明 \([l,r]\) 中第 \(i\) 位都是 \(1\),那么它对按位与的贡献就有 \(2^i\)。

code

#include <bits/stdc++.h>
#define re register
#define int long long

using namespace std;

const int N = 2e5 + 10,M = 34;
int T,n,q;
int arr[N];
int num[M][N];

inline int read(){
	int r = 0,w = 1;
	char c = getchar();
	while (c < '0' || c > '9'){
		if (c == '-') w = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9'){
		r = (r << 3) + (r << 1) + (c ^ 48);
		c = getchar();
	}
	return r * w;
}

inline bool check(int l,int r,int k){
	int sum = 0;
	for (re int bit = 0;bit <= 30;bit++){
		int cnt = num[bit][r] - num[bit][l - 1];
		if (cnt == r - l + 1) sum += (1ll << bit);
	}
	return (sum >= k);
}

signed main(){
	T = read();
	while (T--){
		n = read();
		for (re int i = 0;i <= 30;i++){
			for (re int j = 1;j <= n;j++) num[i][j] = 0;
		}
		for (re int i = 1;i <= n;i++){
			arr[i] = read();
			for (re int bit = 0;bit <= 30;bit++){
				if (arr[i] >> bit & 1) num[bit][i] = 1;
				num[bit][i] += num[bit][i - 1];
			}
		}
		q = read();
		while (q--){
			int l,L,r = n,x;
			L = l = read();
			x = read();
			while (l < r){
				int mid = l + r + 1 >> 1;
				if (check(L,mid,x)) l = mid;
				else r = mid - 1;
			}
			if (check(L,l,x)) printf("%lld ",l);
			else printf("-1 ");
		}
		puts("");
	}
	return 0;
}

标签:Iva,Pav,int,题解,mid,read,while,num,bit
From: https://www.cnblogs.com/WaterSun/p/CF1878E.html

相关文章

  • 安装 SonarQube后sonarqube-sonarqube无法启动的问题解决
    1.前言我的环境:k8s集群(version1.23.6),安装了Kubesphere(versionv3.4)作为可视化界面,最近想要推动团队走CICD,于是在Kubesphere中启用了devops组件,参考:https://kubesphere.io/zh/docs/v3.4/pluggable-components/devops/。组件安装完成后,需要将Sonarqube集成到流水线中,于是又安装......
  • luogu P4819 [中山市选] 杀人游戏 题解 【强连通分量+缩点】
    目录题目链接思路分析代码题目链接P4819思路分析首先考虑这道题的连通性。容易发现这种类型的题目会容易产生环形的状态转移。假设我们知道了其中的一个点是否是黑白点,那么我们就可以知道所有点是否是黑白点。容易陷入一个误区:我们只能通过一个点知道他所相邻的最直接的点,如何......
  • CF1878 A-G 题解
    前言赛时代码可能比较难看。A判定\(a\)中是否有\(k\)即可。赛时代码B奇怪的构造题。令\(a_1=1,a_2=3\),其他项由上一项加一开始枚举判定可行性即可,可以简单证明时间复杂度为\(O(n)\)。赛时代码C容易发现当\(x\in\left[\dfrac{k(k+1)}{2},\dfrac{k(2n-k+1)}{2}\ri......
  • 【UVA 536】Tree Recovery 题解(根据遍历序列还原二叉树)
    小瓦伦丁非常喜欢玩二叉树。她最喜欢的游戏是随机构建查找节点中带有大写字母的二叉树。这是她创作的一个例子:为了给后代记录她的树,她为每棵树写下了两个字符串:预订单遍历(根、左子树、右子树)和有序遍历(左子树、根、右子树。对于上面绘制的树,预序遍历是DBACEGF,有序遍历是ABCDEFG......
  • Codeforces Round 742 Div2 A-D题解
    CodeforcesRound742Div2A-D题解A.DominoDisaster这题就是说给出一些2x1tile,然后给出2xn的第一行构造,问第二行这个刚开始想着是啥dp,一看那么多人过了果断改思路,发现这题就是个模拟题,就是把U换成D,D换成U,L和R不影响,然后输出就行了代码#include<bits/stdc++.h>using......
  • P6411 [COCI2008-2009#3] MATRICA 题解
    水题。发现根据限制\(M_{i,j}=M_{j,i}\)可以知道除了主对角线上的点,其他的点都是成对出现的。也就是说如果有一条要求的\(a_i\)为奇数,那么至少有一个\(c_i\)在主对角线上。记\(S=\sum\limits_{i=1}^{k}(a_i\equiv1\pmod2)\),即有\(S\)个要求中\(a_i\)为奇数。主对......
  • IDEA中的java代码Getters和Setters报红问题解决办法【杭州多测师_王sir】
    今天在新的编辑器中导入新项目时,发现很多get、set、toString的相关方法全部报红,仔细排查发现,原来是bean中注解采用lombok来自动生成get、set、toStirng、equals等方法,而新的编辑器未安装lombok plugin,所以全部报红。Lombok简介项目中经常使用bean,entity等类,绝大部分数据类类中都......
  • 2023.09.26 联考总结&题解
    T1derby你考虑直接贪心进行匹配即可,就是说对于每一个\(1\)去匹配最大的\(0\)#include<bits/stdc++.h>usingnamespacestd;intn,m;vector<int>A[2],B[2];intmain(){ freopen("derby.in","r",stdin); freopen("derby.out","w",s......
  • P6344 [CCO2017] Vera 与现代艺术 题解
    在\(V\timesV\)的平面上,\(n\)次修改,每次给定\(x,y,v\),令\(a,b\)为不超过\(x,y\)的最大的\(2\)的整数次幂,则所有\((x+pa,y+qb)(p,q为自然数)\)都加上\(v\),最后有\(m\)次单点询问一个位置的值。\(1\lex,y,V\le10^{18},1\lev,n,m\le2\times10^5\)我们可以......
  • P9566 [SDCPC2023] K-Difficult Constructive Problem 题解
    @目录DescriptionSolutionSol1Code1Sol2Code2Description有一个长度为\(n\)的01字符串\(s\),其中部分位置已给出,在?的位置处需填入一个1或0。一个填充方案是好的,当且仅当存在\(m\)个不同的\(i\)满足\(1\lei<n\)且\(s_i\nes_{i+1}\)。求所有好的填充方案中字典......