题目链接:  51nod1674 题意:规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积.现在l有一个 N 个数的序列,问所有n*(n+1)/2个区间的贡献的和对1000000007取模后的结果. 解法:暴力是O(n^2),我是尽量找了相差1的区间之间的规律,枚举区间的右端点可以发现当区间 [ l , r ]在右边新添一个数 r+1 时,答案要加上 [r+1,r+1].[r,r+1].[r-1,r+1] ...... [1,r+1].就可以每次存储 f [ i…
最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值为7,这个区间对答案的贡献为2*7=14. 现在lyk有一个n个数的序列,它想知道所有n*(n+1)/2个区间的贡献的和对1000000007取模后的结果是多少.   区间的and值和区间的or值相乘,实际上等于将and值分解为2的幂次和的形式与or值分解成2的幂次和的形式相乘. 所以对于同一段区间…
1674 区间的价值 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值为7,这个区间对答案的贡献为2*7=14. 现在lyk有一个n个数的序列,它想知道所有n*(n+1)/2个区间的贡献的和对1000000007取模后的结果是多少.   例如当这个序列为{3,4,5}时,那么区间[1,1…
位运算: 左移:m<<n将m左移n位,左移后低位补充0: 右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFFF),负数的边界值为(ox80000000,oxFFFFFFFF)) 题目一:请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数. 思路一:将二进制数i与1相与,判断是否为1,然后将tag=1左移一位得到tag=2,然后再与i相与,循环结束的条件是tag==0:该算法的时间复杂度为输入的i的位数.…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的做法是从mid向右扫到r,统计出所有\([mid,i],mid\leq i \leq r\)的and和or值. 然后发现这些and和or值有很多相同的,把相同的压在一起并记录sum,再从mid-1扫到l并暴力从mid向右统计答案. 事实上因为\([mid,i],mid\leq i \leq r\)是…
http://www.51nod.com/contest/problem.html#!problemId=1674 因为题目要求的只是& 和 | 这两个运算.而这两个运算产生的值是有限的. &,当产生的值是0的时候,就不会再变化了. |,当产生的值是(111111111)的时候,值也不变化了. 所以每种运算的状态数也就30种不同的情况. 所以考虑分治, 先算出[mid + 1, R]中的值,就是固定mid + 1,一直向右边&和| 然后在[mid, L]从mid开始一直向左边&am…
不用+,-,*,/运算求和,可以分成三步: 1.计算两个数字的异或值,相当于只计算每一位的和,不计算进位,得出结果sum: 2.计算两个数字的与值,相当于求出两个数字的进位,然后左移一位,相当于进位,得出结果jw: 3.求sum和jw的和,步骤与1,2相同,直到进位jw==0停止计算: 扩展: 不申请额外内存实现两个变量值得交换: 方法一: 通过异或来实现: a=a^b; b=a^b; a=a^b; 方法二: 通过加减运算实现: a=a+b; b=a-b; a=a-b;…
最长公共子序列(LCS)问题 你有两个字符串 \(A,B\),字符集为 \(\Sigma\),求 \(A, B\) 的最长公共子序列. 简单动态规划 首先有一个广为人知的 dp:\(f_{i,j}\) 为 \(A\) 的长度为 \(j\) 的前缀与 \(B\) 长度为 \(i\) 的前缀的 LCS.(注意 \(i\) 和 \(j\) 分别对于那个串) 那么显然有: \[f_{i,j} = \begin{cases} f_{i-1, j-1} + 1 & (A_j = B_i) \\ \max(f…
问题 给出两个幂级数 \(f,g\) ,求 \[ h=\sum _i\sum _jx^{i\oplus j}f_ig_j \] 其中 \(\oplus\) 是可拆分的位运算. 算法 由于位运算具有独立性,可以一位位地考虑. 设 \(f=(f_0,f_1)\) ,即最高位为 0 的部分和最高位为 1 的部分.我们希望把这个卷积转化为点积来做.即 \[ T\begin{bmatrix}f_0 \\f_1 \end{bmatrix}\cdot T\begin{bmatrix}g_0 \\g_1 \en…
题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样. 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反. 思路: 都是暴搜枚举. 第一种方法:暴力dfs枚举 棋子只有最多翻一次,因为翻两次后结果和不翻是一样的,所以整个棋盘最多翻16次. 用step代表翻转的次数,当翻转了step次时,就看一下整个棋盘是否是清一色的.   当棋盘是清一色的时候就直接输出step,得到的就是最少翻转次数使棋盘清一色. 第二种方法:利用位运算来优化 因为棋子不…
8位字节位运算赋值优化特记录下: unsigned short func1(){ unsigned short a; return a;} unsigned char func2(){ unsigned char a; return a;} unsigned short u_16;unsigned char u_8; void sub_027F08(){ UINT8 t8u; // ERAM_u16_81F48 = ((sub_035EC8() == 0) & 1) <<14 | (E…
Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30669   Accepted: 13345 Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the…
题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到一个个区间,这样就是选最小的点覆盖所有的区间的问题了.我之前的一篇博文有较详细的解释:关于贪心算法的经典问题(算法效率 or 动态规划).代码实现我就不写了.…
lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值为7,这个区间对答案的贡献为2*7=14. 现在lyk有一个n个数的序列,它想知道所有n*(n+1)/2个区间的贡献的和对1000000007取模后的结果是多少.   例如当这个序列为{3,4,5}时,那么区间1,11,1,1,21,2,1,31,3,2,22,2,2,32,3,3,33,3的贡献分别为9,0,0,16,20,2…
如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现.下面介绍几个经典贪心问题.(参考自刘汝佳著<算法竞赛入门经典>).P.S.下文皆是我一个字一个字敲出来的,绝对"童叟无欺",哈哈.(.⌒∇⌒) 耗费了我的很多时间,所以--希望对大家有帮助啊~ (=^‸^=) 一.背包相关问题 1.最优装载问题:给出N个物体,有一定重量.请选择尽量多的物体,使总重量不超过C.解法:只关心数量多,便把重量从小到大排序,依次选,直到装不下. 2.部分背包问题:给出N个…
原文地址:http://blog.csdn.net/liema2000/article/details/6118423 ///////////////////////////////////////////////////////////////////////////** 文件名称:FAST apriori.cpp * 摘 要:采用位运算提高算法的效率 * 将每一项抽象为数值,通过与运算判断是否存在,abcde为16,8,4,2,1换成2进制,各占一个位置,互相不干扰.局限于字母.换算的比较字…
svn地址:svn://gitee.com/zxadmin/live_z 2019年2月14日11:38:46 <?php /* * 位运算学习笔记 * * 1,php所有的数都是有符号的,无法指定是否是无符号的 unsign * 2.计算机底层运算都是补码运算的 * 3,0反码,补码都是0 * 4,正数的反码,补码全都一样 * 5,二进制的最高位是符号位,0是正数,1是负数 * 6,负数的反码符号位不变,其他未取反 * 7,负数的补码等于反码+1 * 8,负数(取反)=>反码 +1 =>…
Problem Description 我们定义“区间的价值”为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 现在聪明的杰西想要知道,对于长度为k的区间,最大价值的区间价值是多少. 当然,由于这个问题过于简单. 我们肯定得加强一下. 我们想要知道的是,对于长度为1∼n的区间,最大价值的区间价值分别是多少. 样例解释: 长度为1的最优区间为2−2 答案为6∗6 长度为2的最优区间为4−5 答案为4∗4 长度为3的最优区间为2−4 答案为2∗6 长度…
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但是代码就是过不去..这次应该是无缘复赛了.. 先不水了,省赛回来,我看了一下这个题,当时有个类似于快排的想法,今天试了一下,勉强AC了..跑了3S多. 思路就是我枚举区间左值lt,那么[lt, n]区间内最值的角标分别为mi和ma.于是设to = max(mi, ma).也就是说在to右侧的所有区间…
来源:http://blog.csdn.net/y990041769/article/details/38405063 RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法,当然这个问题用线段树同样能够解决. 问题:给出n个数ai,让你快速查询某个区间的的最值. 算法分类:DP+位运算 算法分析:这个算法就是基于DP和位运算符,我们用dp[i ][j]表示从第 i 位开始,到第 i + 2^j -1 位的最大值或者最小值. 那么…
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本文将覆盖 「二进制」 + 「位运算」 和 Lru 方面的面试算法题,文中我将给出: 面试中的题目 解题的思路 特定问题的技巧和注意事项 考察的知识点及其概念 详细的代码和解析 开始之前,我们先看下会有哪些重点案例: 为了方便大家跟进学习,我在 GitHub 建立了一个仓库 仓库地址:超级干货!精心归…
题意:有N条长度为1的线段,要求使每条线段分别在相应区间,且"空隙"数目最小.输出"空隙"数.(1≤N≤100000) 解法:(P.S.我这题竟做了2个多小时,还是有点迷糊......ヽ(≧□≦)ノ)先按右端点从小到大排序,再是左端点.于是有2个理解:1. 扫一遍,r保存之前的线段的右端点的最大值,分情况讨论:2. (这个我理解了差不多1个小时......qwq 于是我好不容易理解了之后,再进行了一些小修改.)l , r 表示之前线段左.右端点的范围.再分别看没有&…
题意:给出n个区间[a,b),有2个记录器,每个记录器中存放的区间不能重叠.求2个记录器中最多可放多少个区间. 解法:贪心.只有1个记录器的做法详见--关于贪心算法的经典问题(算法效率 or 动态规划).而对于2个,就是在1个的基础上(按 bi 排序,选第一个与之前没有相交的区间)维护2个值,注意要好好for循环遍历一次O(n),若想着用while直接跳过一些区间很容易出错!!!另外,遍历时要先考虑能否把当前的区间接在之前右端点较右的记录器. 1 #include<cstdio> 2 #inc…
A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Submission(s): 1905    Accepted Submission(s): 668 Problem Description Corrupt governors always find ways to get dirty money…
区间的价值 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R-L+1). 现在聪明的杰西想要知道,对于长度为k的区间,最大价值的区间价值是多少. 当然,由于这个问题过于简单. 我们肯定得加强一下. 我们想要知道的是,对于长度为1~n的区间,最大价值的区间价值分别是多少. 样例解释: 长度为1的最优区间为2-2  答案为6*6 长度为2的最优区间为4-5  答案为4*4 长度为3的最优区间为2-4  答案为2*6 长度为4的最优区…
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 & 和 %操作之间的关系!故整理学习资料如下: 原文引自:http://blog.sina.com.cn/s/blog_7b7cad23010163vy.html 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&am…
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 & 和 %操作之间的关系!故整理学习资料如下: 原文引自:http://blog.sina.com.cn/s/blog_7b7cad23010163vy.html 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&am…
51nod 1564 区间的价值 题面 一个区间的价值是区间最大值×区间最小值.给出一个序列\(a\), 求出其中所有长度为k的子区间的最大价值.对于\(k = 1, 2, ..., n\)输出答案. 保证序列随机生成 题解 我的做法是\(O(n \log n)\)的! 对于一个区间[l, r],取其中的最大值,最大值的下标设为mid.对于[l, mid - 1]和[mid + 1, r]两个子区间内的点对,都可以递归处理,所以我们只需关注横跨mid的点对(左端点在[l, mid], 右端点在[…
题解 这个要注意到一个长度大的区间的最大价值一定比长度小的区间的价值要大 然后我们以每个点为最小值,显然区间越长最大值越大,然后我们更新最大区间长度的取值,这个可以用单调栈求这个最小值能更新到的左右端点 最后处理成后缀最大值 代码 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <c…
区间的价值 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description   我们定义“区间的价值”为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 现在聪明的杰西想要知道,对于长度为k的区间,最大价值的区间价值是多少. 当然,由于这个问题过于简单. 我们肯定得加强一下. 我们想要知道的是,对于长度为1…