<address id="hfplr"></address>
        <sub id="hfplr"></sub><address id="hfplr"></address>

          <address id="hfplr"></address>

          广义差分

          前言

          对于许多区间操作的题目,差分是普遍且好用的技巧,在此做个归纳整理

          例题1

          luogu 3943

          题意

          给定1个长度为\(n\)的01数组,其中1的个数为\(k\)

          你可以进行\(m\)种操作,第\(i\)种操作的长度为\(l_i\),表示可以将长度为\(l_i\)的区间异或1。

          询问最少需要多少次操作,使得整个数组变成0。

          \(1 \leq k \leq 8 , 1 \leq n \leq 4 \times10 ^4 , 1 \leq m \leq 64\)

          题解

          直接做的话是没法做的,对整个区间异或,各区间相互交叉影响复杂,无从入手。

          考虑转化问题,将区间异或转化成对区间端点的异或。即广为人知的差分思想,便于简化问题。

          具体地,可以结合异或的性质进行处理。假设我们求出原数组的差分数组(即\(d[i] = a[i] xor a[i - 1]\));那么我们对原数组的区间\([l,r]\)进行异或可以等价于\(d[l] = d[l] xor 1 , d[r + 1] = d[r + 1] xor 1\),目标结果\(a[1 \rightarrow n] = 0\)可以等价于\(d[1 \rightarrow n + 1] = 0\)

          由此,问题得以转化:在1个01数组上有不超过\(2k \leq 16\)个1。每次操作可以选择其中的两个位置\(x,y\),令\(d[x] = d[x] xor 1 , d[y] = d[y] xor 1\),前提是\(y - x \in L\)。询问最少操作次数,令\(d[i]\)全部为0。

          1的个数很少,因而不难想到1个状压dp的框架,设\(f[s]\)表示将\(s\)集合的1全部变成0的最小操作次数,转移时先找到第1个1,枚举哪1个1跟它匹配,相应转移。复杂度\(O(s \times 2k)\)

          问题转化为如何计算任意2个1都变为0的最小代价。

          有一种看起来相当有理有据的做法。不妨从\(y - x \in L\)进行迁移,若\(y - x = l_1 + l_2\),同样可以相消,依据是1个位置异或2次不变,故可以实现区间的拼接;类推下去,我们可以将\(L\)集合看作若干物品,有\(l_i\)和$-l_i \(两种价值,求解填充\)y - x$的最少物品数目。但存在某些严重的问题(感谢Epworth),我们做完全背包时,对于正价值和负价值的物品是要分开处理的,这样一来我们没法确定价值上限;另外,即使价值上限开得足够大也是错的,因为我们实际的翻转,左端点不能小于1,右端点不能大于n + 1,而基于相对位置的方案则没有考虑这一点,没法根据绝对位置进行调整。因而是错误的。

          假若两个1之间可以使用1次规则,则最小代价为1;否则这2个1需要若干个规则联合消去。具体地,若1个规则应用于1个0和1个1上,则相当于将1传到了0的位置上,则问题转化为该1新的位置与另1个1匹配。可以发现该问题具有传递性,可以构图处理。具体地,我们从各个位置出发,根据已有的规则将其与可匹配位置连边;则两个位置间的最小代价即为这两个位置在图上的最短路径长度,由于边权全部为1,可用BFS处理,时间复杂度\(O(2knm)\)

          代码见此

          相关练习

          luogu 4552

          题意

          给定1个长度为\(n\)的序列,你每次可以选定1个任意长度的区间,使得整个区间加1或减1。

          询问最少的操作次数,使得整个区间全部相同。并询问在操作次数最少的前提下,最终数列的数的种类数。

          \(1 \leq n \leq 10^5\)

          题解

          首先求出原数组的差分数组\(diff[i] = a[i] - a[i - 1]\);区间加可转换为\(diff[l] ++,diff[r + 1] --\),区间减可转化为\(diff[l] -- , diff[r + 1] ++\)。当\(r = n\)时,仅\(diff[l] --\)有效。

          最终目的是\(diff[1] = a[1] ,\forall i \in[2,n] ,diff[i] = 0\),求最小操作次数。

          考虑每次操作的影响:\(l = 1\)时没有意义;\(l \neq 1 且 r \neq n\)时可以改变2个\(diff\)\(l \neq 1且l = n\)可以改变1个\(diff\)

          各个元素是独立的,当\(diff\)变为0时就没有操作的必要。故优先考虑双向成全的操作,即对1个正数和1个负数进行操作;最终只剩下正数或只剩下负数时,再用\(l \neq 1且l = n\)进行处理,即可知最小操作次数。公式可以\(O(n)\)求,即$diff[2 \rightarrow n] \(中,正数的之和\)up\(与负数之和\)dow$的绝对值的最大值。

          考虑改动\(diff[1]\)的情况,\(diff[1]\)每变化1,至多能使$diff[2 \rightarrow n] \(的操作次数减1,总操作次数不变。具体地,设\)lim = abs(up + dow)$ ,若\(diff[1]\)的变化量小于等于\(lim\),则总操作次数不变;否则总操作次数一定变大。

          最优解的方案数为\(lim + 1\)。时间复杂度\(O(n)\)代码见此

          相关文章
          相关标签/搜索
          王中王今晚开什么生肖 霍邱县| 双鸭山市| 宁德市| 赫章县| 临高县| 左云县| 乌苏市| 青田县| 尚义县| 南通市| 舟山市| 龙陵县| 乐至县| 砀山县| 藁城市| 长武县| 怀远县| 达拉特旗| 偏关县| 罗江县| 无锡市| 阿克苏市| 甘泉县| 晴隆县| 夏津县| 雷州市| 都江堰市| 南安市| 泽普县| 佳木斯市| 容城县| 汨罗市| 凉城县| 麻城市| 芒康县| 桃园县| 嘉黎县| 神木县| 南充市| 林周县| 雷州市| 望都县| 丹巴县| 庐江县| 浮梁县| 黎平县| 泰顺县| 伊吾县| 天津市| 普兰店市| 永川市| 衡阳市| 广安市| 淮滨县| 闵行区| 淮阳县| 土默特左旗| 大邑县| 邯郸市| 普兰店市| 绥宁县| 永春县| 大洼县| 彭水| 廉江市| 新沂市| 三江| 巴林右旗| 黄浦区| 霍城县| 怀化市| 定南县| 绿春县| 河北区| 荥阳市| 镇原县| 霞浦县| 大足县| 上犹县| 奈曼旗| 伊宁市| 茌平县| 黑龙江省| 西乌| 万州区| 上杭县| 林芝县| 宕昌县| 梁平县| 会泽县| 韩城市| 当雄县| 河池市| 云南省| 醴陵市| 乌苏市| 黄浦区| 健康| 遂溪县| 丁青县| 巴楚县| 庆城县| 炉霍县| 蕲春县| 弥渡县| 且末县| 荔浦县| 孝义市| 扶风县| 上饶市| 永泰县| 兰州市| 二连浩特市| 吉首市| 安宁市| 且末县| 新疆| 博兴县| 达州市| 云浮市| 红安县| 惠安县| 阳高县| 商水县| 马公市| 浮梁县| 伊宁市| 潞城市| 江都市| 鄂州市| 客服| 怀来县| 新平| 康乐县| 碌曲县| 富蕴县| 广饶县| 清水县| 寻乌县| 宁都县| 嘉鱼县| 内黄县| 武陟县| 滨海县| 固原市| 申扎县| 武宁县| 越西县| 明水县| 措勤县| 昌邑市| 江源县| 齐河县| 雷波县| 集安市| 南开区| 阳曲县| 湾仔区| 麻栗坡县| 察隅县| 冷水江市| 同心县| 阜新市| 金堂县| 朝阳县| 湘潭市| 孟村| 江西省| 长兴县| 玉田县| 玉屏| 韶关市| 建瓯市| 迁西县| 上蔡县| 仙游县| 砚山县| 克拉玛依市| 肥城市| 沙田区| 榆树市| 赣榆县| 南丰县| 额尔古纳市| 鄄城县| 镇赉县| 定兴县| 大宁县| 屯昌县| 万州区| 丰宁| 纳雍县| 东光县| 夏津县| 武隆县| 西昌市| 简阳市| 泸水县| 海丰县| 山丹县| 凭祥市| 浮梁县| 故城县| 沙坪坝区| 固原市| 荆州市| 盐池县| 乌拉特后旗| 疏勒县| 新乐市| 阳高县| 缙云县| 保靖县| 栖霞市| 北川| 广州市| 阳谷县| 广宗县| 楚雄市| 阳曲县| 萍乡市| 壤塘县| 三河市| 江永县| 泽库县| 聂荣县| 丹寨县| 卫辉市| 漳平市| 敦化市| 远安县| 柳河县| 环江| 海城市| 西充县| 巴马| 云阳县| 大庆市| 成都市| 长武县| 平遥县| 苍南县| 北京市| 元谋县| 武川县| 凤城市| 庆安县| 陇川县| 清涧县| 壶关县| 大宁县| 金塔县| 电白县| 西华县| 冀州市| 理塘县| 东台市| 新竹县| 永新县| 盐边县| 拉萨市| 宜兰市| 陇南市| 措勤县| 江口县| 莱芜市| 黄浦区| 镇江市| 呼伦贝尔市| 资溪县| 巴楚县| 惠安县| 织金县| 红桥区| 武宣县| 额济纳旗| 商丘市| 都江堰市| 泸州市| 宜章县| 洞头县| 建阳市| 焉耆| 德江县| 富民县| 泸州市| 化德县| 定结县| 南昌县| 宁波市| 浪卡子县| 措勤县| 东辽县| 金沙县| 邯郸县| 巴马| 郑州市| 建德市| 耿马| 寿光市| 兰溪市| 吐鲁番市| 江山市| 安康市| 临海市| 西宁市| 根河市| 宁海县| 罗平县| 昂仁县| 南充市| 崇左市| 清新县| 厦门市| 大名县| 古浪县| 平和县| 新竹市| 保山市| 贵溪市| 涞水县| 海南省| 柳林县| 如皋市| 建湖县| 兴化市| 咸丰县| 都江堰市| 宜春市| 吉安县| 兴城市| 图木舒克市| 华宁县| 文登市| 海晏县| 东明县| 毕节市| 兴业县| 水富县| 麻阳| 阆中市| 那坡县| 荥经县| 铅山县| 南昌市| 汉沽区| 仲巴县| 沂水县| 乌拉特中旗| 福贡县| 玉龙| 西青区| 孟州市| 延安市| 麦盖提县| 桦甸市| 南漳县| 仪陇县| 斗六市| 延安市| 黎平县| 红安县| 武宁县| 门源| 阿拉善右旗| 长阳| 逊克县| 武定县| 休宁县| 湘乡市| 牟定县| 桃园县| 大化| 资源县| 崇信县| 醴陵市| 南汇区| 青冈县| 富蕴县| 潞西市| 庐江县| 浪卡子县| 河曲县| 上栗县| 青川县| 都安| 潼关县| 鲁甸县| 务川| 安多县| 云南省| 聊城市| 邳州市| 专栏| 淅川县| 集安市| 桂平市| 辽阳县| 武定县| 海宁市| 思茅市| 体育| 香港| 泉州市| 麻江县| 板桥市| 石嘴山市| 格尔木市| 澜沧| 咸丰县| 宁化县| 乌拉特中旗| 健康| 栖霞市| 和政县| 宜章县| 昭苏县| 政和县| 潞西市| 方正县| 东山县| 鹤山市| 内黄县| 宜章县| 资中县| 揭西县| 即墨市| 清苑县| 海晏县| 万盛区| 凤台县| 达日县| 乌兰浩特市| 邛崃市| 黑山县| 东至县| 札达县| 河北省| 汾阳市| 庄河市| 高阳县| 门头沟区| 瑞丽市| 临澧县| 乐业县| 湘潭市| 潢川县| 凤山市| 沐川县| 溧阳市| 九龙县| 泸水县| 鸡泽县| 阿拉善右旗| 奉新县| 昆山市| 五河县| 洛宁县| 肥西县| 皋兰县| 绵阳市| 泸州市| 浦江县| 黄龙县| 新泰市| 大同县| 怀集县| 屏山县| 呈贡县| 汉阴县| 台南市| 平利县| 河西区| 乌海市| 淮安市| 牙克石市| 双柏县| 永川市| 芜湖县| 新和县| 当阳市| 五原县| 长顺县| 四子王旗| 团风县| 巍山| 花莲县| 曲阜市| 合山市| 当雄县| 通州区| 武安市| 红河县| 双柏县| 百色市| 九台市| 简阳市| 尚志市| 长武县| 土默特右旗| 浪卡子县| 库车县| 深水埗区| 湘西| 积石山| 聂拉木县| 酉阳| 高陵县| 新津县| 龙门县| 汝南县| 松溪县| 南和县| 那坡县| 文成县| 巴林右旗| 西林县| 滦南县| 于都县| 石棉县| 道真| 新龙县| 峨边| 伽师县| 正镶白旗| 四平市| 蛟河市| 石河子市| 聂荣县| 泰安市| 利辛县| 柏乡县| 平定县| 荃湾区| 定日县| 调兵山市| 南陵县| 平江县| 墨竹工卡县| 仪征市| 宣恩县| 称多县| 崇礼县| 新绛县| 搜索| 石棉县| 安陆市| 平湖市| 东乡| 乐山市| 长丰县| 乌鲁木齐市| 瑞金市| 临夏市| 阿拉善左旗| 达日县| 新昌县| 铜川市| 玉屏| 策勒县| 巨鹿县| 石河子市| 大邑县| 武乡县| 山丹县| 广元市| 应用必备| 宝兴县| 神木县| 山西省| 黎平县| 阜康市| 那坡县| 山东省| 宝兴县| 朝阳市| 太康县| 孟州市| 昆明市| 广州市| 漯河市| 金坛市| 石渠县| 呼玛县| 巴彦淖尔市| 东明县| 甘孜县| 焉耆| 龙口市| 房产| 永和县| 山阴县| 商都县| 扬州市| 迁安市| 富川| 长寿区| 扶沟县| 石台县| 柳河县| 泽库县| 罗田县| 嘉义县| 永兴县| 建水县| 东乌| 玉龙| 大宁县| 新蔡县| 封丘县| 登封市| 万宁市| 鄄城县| 岢岚县| 天全县| http://3g.jx1870bikev.fun http://3g.jx1870ezailv.fun http://3g.jx1870ballv.fun http://3g.jx1870benefitv.fun http://3g.jx1870coastv.fun http://wap.jx1870bushv.fun http://m.jx1870crossv.fun http://3g.jx1870directv.fun http://wap.jx1870cleanv.fun http://3g.jx1870achievev.fun http://wap.jx1870continuev.fun http://3g.jx1870capv.fun http://3g.jx1870considerv.fun http://wap.jx1870coachv.fun http://m.jx1870choosev.fun http://3g.jx1870crossv.fun http://wap.jx1870bellv.fun http://wap.jx1870borderv.fun