【贪心 位运算】JZOJ_3518 进化序列(evolve)

2024-01-30 04:32

本文主要是介绍【贪心 位运算】JZOJ_3518 进化序列(evolve),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

给一个数列 A A A,其中 A x A_x Ax可以进化到 A y A_y Ay的条件:
1 ) x &lt; y 1)x&lt;y 1)x<y
2 ) A x ∣ A x + 1 ∣ A x + 2 ∣ . . . ∣ A y &lt; M 2)A_x|A_{x+1}|A_{x+2}|...|A_y&lt;M 2)AxAx+1Ax+2...Ay<M

思路

我们维护一个队列,可以知道它是一直往右的。
每次往队尾加入一个数,然后一直踢掉队头直到满足当前队列中的或值 &lt; M &lt;M <M(因为当前如果不满足或值 &lt; M &lt;M <M的话那么队头的数就不能进化到后面的数)
答案累加 t a i l − h e a d tail-head tailhead,代表前面的每个数都能进化到当前队尾的数。

代码

#include<cstdio>
#include<algorithm>int N, M;
long long ans;
int a[100001], v[100001];//v记录每一位上1的个数void insert(int x) {for (int i = 0; i <= 30; i++)v[i] += (x >> i) & 1;
}void del(int x) {for (int i = 0; i <= 30; i++)v[i] -= (x >> i) & 1;
}int getK() {int r = 0;for (int i = 0; i <= 30; i++)r += (std::min(v[i], 1) << i);return r;
}int main() {scanf("%d %d", &N, &M);for (int i = 1; i <= N; i++)scanf("%d", &a[i]);int head = 1;for (int i = 1; i <= N; i++) {insert(a[i]);while (getK() >= M && head < i)del(a[head++]);ans += i - head;}printf("%lld", ans);
}

这篇关于【贪心 位运算】JZOJ_3518 进化序列(evolve)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659108

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

ural 1820. Ural Steaks 贪心

1820. Ural Steaks Time limit: 0.5 second Memory limit: 64 MB After the personal contest, happy but hungry programmers dropped into the restaurant “Ural Steaks” and ordered  n specialty steaks

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu