首页 > 其他分享 >baka's trick

baka's trick

时间:2024-11-13 15:19:41浏览次数:1  
标签:le gcd 加入 复杂度 mid trick baka

众所周知,双指针适用于一类固定左端点,右端点具有单调性的问题,由于每个点只会被删一次,所以令加入/删除的时间复杂度为 \(O(B)\),总时间复杂度 \(O(nB)\)。

而对于一些信息,加入是简单的,但是删除是困难的(例如 gcd、min)等,这时我们考虑 baka's trick 把删除扔掉。

考虑设一个阈值 \(p\),假设当前双指针两个端点是 \(l,r\),要维护的信息是 \(f(l,r)\),我们开两个栈,一个栈维护 \(\forall l\le i\le mid,f(i,mid)\),另一个栈维护 \(\forall mid<i\le r,f(mid+1,r)\),当 \(l\) 或者 \(r\) 右移时,我们只需要弹栈就行。要得到 \(f(l,r)\) 时,只需要合并两个栈顶的信息即可。当 \(l\) 移出 \(mid\) 时,令新的 \(mid\) 为原来的 \(r\),则我们把另一个栈维护的信息从 \(\forall mid<i\le r,f(mid+1,i)\) 重构成 \(\forall mid<i\le r,f(i,r)\),然后令 \(l\) 为原来的 \(mid\),\(mid\) 为原来的 \(r\),然后这个栈就变成维护 \(\forall l\le i\le mid,f(i,mid)\) 的了,以此类推下去。

这样我们只会加入和合并,令加入/合并的时间复杂度为 \(O(C)\),总时间复杂度 \(O(nC)\)。

一个例子:求 \(l\le r\) 的数量使得 \(\gcd_{i=l}^ra_i\not=1\)。我们要维护的信息是 \(f(l,r)=\gcd(a_l,\cdots,a_r)\),加入和合并复杂度均为 \(O(\log V)\),时间复杂度 \(O(n\log V)\)。

一个不太行的例子:求 \(l\le r\) 的数量使得 \([l,r]\) 内的物品做背包(令背包容量为 \(m\))的最大价值小于等于 \(k\)。我们要维护的信息是 \(f(l,r)=\operatorname{knapsack}(l,\cdots,r)\),即对区间内物品做背包后的结果。虽然加入的时间复杂度为 \(O(m)\),但是合并时间复杂度为 \(O(m^2)\),所以总时间复杂度是 \(O(nm^2)\),在某些题上可能需要更快的解法。

标签:le,gcd,加入,复杂度,mid,trick,baka
From: https://www.cnblogs.com/dcytrl/p/18544036

相关文章

  • [Tricks-00002]CF2026F 操作建树&维护带删deque信息的经典套路
    这怎么是*2700???我大受震撼了好吧。简要题意:有一个初始长度是\(cnt=1\)的序列\(S\),序列每个位置都是若干个二元组\((p,t)\)组成的可重集,初始时\(S_1\)为空集。\(q\)组操作(为修改或询问),有如下四种操作:1x:把\(S_x\)复制到一个新加的点\(S_{++cnt}\)上。2xpt:将\((p......
  • Patrick Cozzi简介
    ChiefPlatformOfficer,BentleySystems,andFounder,Cesium宾利系统公司首席平台官,兼Cesium创始人。PatrickCozziistheChiefPlatformOfficeratBentleySystems.Inthisrole,hesupportstheteamsdedicatedtotheglobalcommunityofsoftwaredevelopersw......
  • 快速求图上最小点定联通块权值的Trick
    更新日志概念图上最小点定连通块,就是给出无向连通图上一些点,要求找出边权和最小的连通分量使这些点强连通。现在要求这个连通块内的边权之和。思路先给出结论:把节点按照dfs序排序,统计所有相邻的节点以及起始点与末尾点之间的距离,将它们求和,所求的答案即为这个和除以2。感......
  • C++刷题tricks整理
    是自己做题中整理的常用C++操作,此为存档。STL容器容器适配器,STL里面的vector/array/deque/set/map/unordered_set可以直接使用==比较是否相等:vector<int>a;deque<int>a;map<int,string>a;unordered_map<int,string>a;set<int>a;unordered_set<int>a;forward_lis......
  • CTF 的基础知识 & 题型 & Trick总结
    references:12webphp语法基础references:1php脚本的基本格式:<?php//codinghere?>php代码同样以;结尾。php文件的后缀名大多是php,也有诸如php5php4phps之类,如果普通的后缀名被拦截不妨试试其他的。php变量用$来定义,大小写敏感,但是不用声明数据类型......
  • tricks
    二分答案P2824排序有时候可以尝试二分最后的答案,把不好维护的东西变成\(0\)和\(1\)。操作分块P5443桥梁将操作分块维护,一般适用于可以很好维护静态询问但是需要支持修改的情况(?)。状态压缩去除后效性P2157学校食堂dp有后效性但影响范围很小可以考虑把后续决策压缩起......
  • [Trick] 格路记数 - 反射容斥
    Perface模拟赛不会被冲烂了。ProblemI从\((0,0)\)到\((n,m)\)方案数。解法:\(C(n+m,m)\)。ProblemII从\((0,0)\)到\((n,m)\)方案,但是不能经过\(y=x+b\)的直线。解法:考虑映射法。以一条路径第一次碰到直线的位置为起点,之后所有的路线和\(y=x+b\)对称,这样可......
  • Tricks(长期更新)
    会很杂,尽量分类,每个trick会配题。难以分类的难以分类可能只是自己太菜了。曼哈顿距离与切比雪夫距离的转化对于两点\((x_1,y_1),(x_2,y_2)\),曼哈顿距离为\(|x_1-x_2|+|y_1+y_2|\),切比雪夫距离为\(\max(|x_1-x_2|,|y_1-y_2|)\)。画图可以发现到原点的曼哈顿距离为\(1\)的点形......
  • 位运算 之 小 trick
    异或 只出现一次的数字(其他两次) 136.只出现一次的数字一串数中,每个数都出现2次,只有一个数出现1次,求出这个数。考察异或的性质,根据a^a=0,a^0=a那么就对每个数异或一下即可。然后根据交换律,每个数都异或了之后,相同的都归0了,剩下一个就自动求出来了。大概是这样(找不到C+......
  • 关于离散化+Trick
    离散化干嘛用的不多说。你不会去问度娘吗板板经常忘又懒得找。遂写一模板暂存。//a为原数组,b为a的副本voidversion1(){ sort(b+1,b+1+n); intsiz=unique(b+1,b+1+n)-b-1; for(inti=1,k;i<=n;i++) a[i]=lower_bound(b+1,b+1+siz,a[i])-b-1;}unordered_map<int,i......