文章目录

  • 代码
  • 排序
  • 位运算
  • 枚举
  • 前缀和差分
  • 二分
  • 贪心
  • 倍增

代码

排序

题目 题意 思路 代码
奇数码问题 给定两个奇数码局面,判断是否可达。 将两个数码写成序列,求逆序对看奇偶性是否相同。 120
天才ACM 给定一个序列,定义 [l,r][l,r][l,r] 的校验值为从中取出 2m2m2m 个数(不够则取到不能取为止),使得“每对数的差的平方”之和最大。求至少将序列分成多少段,使得每段的校验值不超过 TTT。 这题真正把二分和倍增拉开差距了。如果用二分,每次需要 O(nlog⁡n)O(n\log n)O(nlogn) 的时间,那么如果段很小,那么需要 O(n2log⁡n)O(n^2 \log n)O(n2logn),如果用倍增,只需要将其拆解成 log⁡\loglog 段,每段是 O(nlog⁡n)O(n\log n)O(nlogn),那么则只需 O(nlog⁡2n)O(n\log^2 n)O(nlog2n),效率远超二分。如果再用二路归并优化,只对新增部分排序,那么可以进一步优化成 O(nlog⁡n)O(n\log n)O(nlogn)。 121

位运算

题目 题意 思路 代码
起床困难综合症 给定若干次与、或、异或运算,在 1∼m1\sim m1∼m 中选择一个整数,使得依次进行这些运算结果最大。 考虑到每一位是独立的,而二进制中高位一定比低位重要。所以考虑从高往低。预处理出每一位初始是 1,01,01,0 时最终的结果,如果填零时答案为 000 或填什么都是 000,那么没必要填 111,这样后面可以填更大;否则还需保证剩余的 mmm 范围足够,就填 111,同时 mmm 减去位权。 119

枚举

题目 题意 思路 代码
进位 规定 popcount(x)\text{popcount}(x)popcount(x) 表示 xxx 在二进制表示下所含 111 的个数。有一个二进制数 BBB(以一个长为 nnn 的 010101 字符串形式给出)和长为 mmm 的序列 aaa。还需要对 BBB 进行 mmm 次操作。其中,第 iii 个操作为 B←B+2aiB \gets B + 2^{a_i}B←B+2ai​,其价值 viv_ivi​ 为 BBB 在操作前后变化的位置数量,即 vi=popcount⁡(Bxor(B+2ai))v_i = \operatorname{popcount}(B \mathbin{\mathrm{xor}} (B + 2^{a_i}))vi​=popcount(Bxor(B+2ai​))。解决两个问题:任意安排操作顺序,问在执行所有操作后,∑i=1mvi\displaystyle \sum_{i=1}^mv_ii=1∑m​vi​ 最大为多少?任意安排操作顺序,问在执行所有操作后,max⁡i=1mvi\displaystyle \max_{i=1}^mv_ii=1maxm​vi​ 最大为多少? 第一个操作的影响是任意的,顺序不会决定结果。而第二个需要根据连续进位次数取最大值。 29
[NOI Online 2021 入门组] 吃豆人 给定 n2n^2n2 的点阵,求使用两个吃豆人能吃到的数字之和的最大值。每个吃豆人可以选择初始位置和初始方向(左上左下右上右下),然后碰到边界镜像反弹,一个数字最多被吃一次。2≤n≤1000,0≤ai,j≤10002\le n\le 1000,0\le a_i,j\le 10002≤n≤1000,0≤ai​,j≤1000 首先我们画一画图:容易发现,每个吃豆人吃豆的路线都是矩形框(除了最上面和最下面退化为线段)。于是,我们便可以把 nnn 种吃豆路线就算出来,然后任选两个路线,枚举怎样吃豆最多。不难发现,相交的点都是可以计算出来的,首先,两点之和 mod=1\mod =1mod=1 则没有交点,其次两个矩形框出现四个交点,我们可以计算他们的坐标,在 O(1)O(1)O(1) 时间内计算: x1=(i+j)/2 y1=(x1-i)+1 x2=x1+1-i y2=y1+i-1 x3=x1+n-j y3=y1+n-j x4=x3+1-i y4=y3+i-1至此,四个点都计算出来了,就减掉,还有如果是一条直线一个矩形框的,把结果 ÷2\div 2÷2。 50

前缀和差分

题目 题意 思路 代码
Bassline 给定 nnn 个区间,第 iii 个区间是 [li,ri][l_i,r_i][li​,ri​]。你需要选择两个整数 x≤yx\le yx≤y,满足:对于所有区间 [li,ri][l_i,r_i][li​,ri​](1≤i≤n1\le i \le n1≤i≤n),以下两个条件之一满足:1. [x,y][x,y][x,y] 被 [li,ri][l_i,r_i][li​,ri​] 包含,换言之, [x,y]∩[li,ri]=[x,y][x,y]\cap[l_i,r_i]=[x,y][x,y]∩[li​,ri​]=[x,y]。2. [x,y][x,y][x,y] 与 [li,ri][l_i,r_i][li​,ri​] 无交集,换言之,[x,y]∩[li,ri]=∅[x,y]\cap[l_i,r_i]=\varnothing[x,y]∩[li​,ri​]=∅。若有 kkk 个区间满足条件 1,则你的得分是 k(y−x)k(y-x)k(y−x)。输出你最大的可能的得分。1≤n≤3×105,1≤li≤ri≤3×1051 \le n \le 3 \times {10}^5,1 \le l_i \le r_i \le 3 \times {10}^51≤n≤3×105,1≤li​≤ri​≤3×105 用样例举例子:可以发现如果我们选择的区间如果跨越了至少一个端点,那么这个区间必定不合法。但是还有一些边界情况,如 [3,4][3,4][3,4] 区间,它没有跨越任何一个端点,但它却是不合法的区间。这时可以发现还有一个充要条件是,如果 [x,y][x,y][x,y] 区间合法,那么 [x+1,y][x+1,y][x+1,y] 不含任意一个左端点,[x,y−1][x,y-1][x,y−1] 不含任意一个右端点。像 [4,5][4,5][4,5] 区间,因为 [5,5][5,5][5,5] 区间包含了一个左端点 555 ,所以它不合法,而 [7,8][7,8][7,8] 区间,因为 [7,7][7,7][7,7] 区间包含了 777 这个右端点,所以它也不合法。而要算一个点被几个点覆盖,只需要差分和前缀和即可计算。 28
最大的差 给定 3N3N3N 个数,现在要从中删去 NNN 个,使得删除之后这个长度为 2N2N2N 的序列的前 NNN 项的和减去后 NNN 项的和尽可能大。求这个差最大是多少。n≤106,ai≤109n\le 10^6,a_i\le10^9n≤106,ai​≤109 可以考虑枚举一个点 kkk,对于它前面的数中的前 NNN 大,后面的数中的前 NNN 小作差即可。考虑扫两遍,用堆维护,外加前缀和。时间复杂度 O(Nlog⁡N)O(N\log N)O(NlogN) 73

二分

题目 题意 思路 代码
书的复制 把长度为 mmm 的数列分为 kkk 段,求各段的和中的最大值对应的方案,如果有多组解,输出字典序最小的方案。1≤k≤m≤5001\le k \le m \le 5001≤k≤m≤500 这题与数列分段问题基本相似,求的是最大的一段最小。不过需要注意的一点是,这里要让前面的人少抄写,所以应该在判断时倒着分配书稿。 30
切绳子 有 NNN 条绳子,它们的长度分别为 LiL_iLi​。如果从它们中切割出 KKK 条长度相同的绳子,这 KKK 条绳子每条最长能有多长?答案保留到小数点后 222 位(直接舍掉 222 位后的小数)。0<Li≤100000.00,0<n≤10000,0<k≤100000<L_i\leq 100000.00,0<n\leq 10000,0<k\leq 100000<Li​≤100000.00,0<n≤10000,0<k≤10000 二分绳子的每段长,然后计算有多少段,如果多了,移动左指针(还可以大),少了反之,不过此题有精度问题,故结果 +10−4+10^{-4}+10−4 才好。 31
包裹快递 要将 nnn 个包裹分别送到 nnn 个地方,并分配给邮递员一个事先设定好的路线,需要按照路线给的地点顺序相继送达,且不能遗漏一个地点。得到每个地方可以签收的时间段,并且也知道路线中一个地方到下一个地方的距离。若到达某一个地方的时间早于可以签收的时间段,则必须在这个地方停留至可以签收,但不能晚于签收的时间段,可以认为签收的过程是瞬间完成的。求出车的最大速度最小是多少。0<n≤2×1050<n \le 2\times10^50<n≤2×105,xi≤yi≤108x_i \le y_i \le 10^8xi​≤yi​≤108,si≤107s_i \le10^7si​≤107 二分它的速度,每次累加它已经用的时间,如果发现时间已经超过了最晚签收时间,那么直接返回,否则继续累加,如果出现比最早的签收时间还小,那么需要等到最早的签收时间,然后因为实数二分是永远分不完的,所以我们在它们的差相差很小是就可以停下了。 32
聪明的质监员 有 nnn 个 wiw_iwi​ 和 viv_ivi​ 。给定 mmm 个区间 [li,ri][l_i,r_i][li​,ri​],选出一个参数 WWW,对于一个区间 [li,ri][l_i,r_i][li​,ri​],yi=∑j=liri[wj≥W]×∑j=liri[wj≥W]vjy_i=\sum\limits_{j=l_i}^{r_i}[w_j \ge W] \times \sum\limits_{j=l_i}^{r_i}[w_j \ge W]v_jyi​=j=li​∑ri​​[wj​≥W]×j=li​∑ri​​[wj​≥W]vj​,其中 jjj 为矿石编号。调整 WWW 的值,使得绝对值 s−∑i=1myis-\sum_{i=1}^m y_is−∑i=1m​yi​ 最小。求出这个最小值。1≤n,m≤200,0001 ≤n ,m≤200,0001≤n,m≤200,000,0<wi,vi≤1060 < w_i,v_i≤10^60<wi​,vi​≤106,0<s≤10120 < s≤10^{12}0<s≤1012,1≤li≤ri≤n1 ≤l_i ≤r_i ≤n1≤li​≤ri​≤n 。 首先此题直观为二分题,要二分的对象是 WWW,然后根据题目中的步骤算出检验值,判断是否比标准大,移动 lll,否则移动 rrr,最后check一下两个值,相差值最小的选出,不过这样的复杂度是一个 log⁡n×n×m\log n\times n\times mlogn×n×m个区间,会超时。这里 mmm 次区间询问,我们可以在二分函数内 O(n)O(n)O(n) 前缀和,对于 mmm 个询问 O(1)O(1)O(1) 出解,这样复杂度可降为一个 log⁡n×(n+m)\log n\times(n+m)logn×(n+m),可以通过本题。 33
关押罪犯 有两座监狱,一共关押着 NNN 名罪犯。怨气值表示某两名罪犯之间的仇恨程度。如果两名怨气值为 ccc 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为 ccc 的冲突事件。求重新分配罪犯后的影响力最大的冲突事件影响力的最小值。N≤20000,M≤100000N\leq 20000,M\leq 100000N≤20000,M≤100000。 二分最大怨气值,然后把比这个怨气值大的怨气关系进行二分图判定。 34
CF732D Exams 一个人有 mmm 门科目需要考试,每一门科目需要 a[i]a[i]a[i] 的复习时间(复习时间可以不用连续),并且有一份 nnn 天的考试安排表,其中 did_idi​ 表示第 iii 天能考第 iii 门科目,假如 did_idi​ 为 000,就代表这一天没有任何科目的考试。试求这个人最少在第几天顺利通过所有考试?(注:这个人一天要么只能考试,要么就只能复习)(1≤n,m≤105)(1\le n,m\le 10^5)(1≤n,m≤105) 二分完成天数,然后把不超过完成天数的每门课可以考的最后天数存下来,如果当天没有上课或者不是当门课最后天数,那么复习时间 +1+1+1,否则查看当前复习时间是否够,如果发现有 111 次考试没时间准备,那么就不可行,挪动左端点,否则挪动右端点。 35
CF626C 一群人在搭建积木塔。 有 NNN 个人 222 块 222 块往上搭,有 MMM 个人 333 块 333 块往上搭,每个人塔的高度都要大于 000,且高度各不相同,问最高的塔高度的最小值。(0≤n,m≤106)(0\le n,m\le10^6)(0≤n,m≤106) 二分最高的塔高度 hhh,判断是否可行先判断 h≥2nh\ge 2nh≥2n(保证 nnn 个人 222 块 222 块往上搭可行),h≥3mh\ge 3mh≥3m(保证 mmm 个人 222 块 222 块往上搭可行),h÷2+h÷3−h÷6≥n+mh\div2+h\div3-h\div6\ge n+mh÷2+h÷3−h÷6≥n+m(保证互相重合的情况下总数要可行)。 36
apart 有 nnn 个 aia_iai​ 和 bib_ibi​,你可以任意选择若干个 aia_iai​ 和 bib_ibi​,求 max⁡(min⁡(∑ai(choosed),∑bi(choosed)))−10choosedcnt\max(\min(\sum a_i(choosed),\sum b_i(choosed)))-10choosed_{cnt}max(min(∑ai​(choosed),∑bi​(choosed)))−10choosedcnt​。1≤n≤105,10≤ai≤bi≤1041\le n\le 10^5,10\le a_i\le b_i\le 10^41≤n≤105,10≤ai​≤bi​≤104。 先考虑贪心。设选 aaa 个 aia_iai​ bbb 个 bib_ibi​,因为价格相同,优先选择价值高的 ai,bia_i,b_iai​,bi​,先排序,于是时间复杂度为 O(n2)O(n^2)O(n2),707070 分。考虑优化。因为结果是在两者之间取最小值再减成本,所以可以枚举 aaa ,如果要让 suma≤sumbsum_a\le sum_bsuma​≤sumb​ (sumsumsum 表示前缀和),则可以用二分找到最小的 bbb,如果 suma>sumbsum_a>sum_bsuma​>sumb​,则把刚才求得的 bbb 即可。时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)。 37

贪心

题目 题意 思路 代码
雷达探测 撤离路线可以看作一个长为 nnn 的序列,而敌方已将其 mmm 支奇袭小队部署在了撤离路线上!序列中的第 iii 个数 aia_iai​ 代表第 iii 个位置存在一个敌方奇袭小队成员,他所属的奇袭小队编号为 aia_iai​。现在,你所在的车将从序列的第 111 个位置开到第 nnn 个位置,每到达一个新的位置 iii,你都会使用雷达探测位置 i−bii-b_ii−bi​ 到位置 iii 间的所有敌人(若 i−bi<1i-b_i<1i−bi​<1 则探测位置 111 到位置 iii 间),由于连续使用雷达会导致雷达性能下降,序列 bbb 是单调不增的。对于每一次探测,你需要输出探测范围内,人数最多的奇袭小队内有多少人。1⩽n⩽1061\leqslant n\leqslant10^61⩽n⩽106,1⩽m⩽1051\leqslant m\leqslant10^51⩽m⩽105,1⩽ai⩽m1\leqslant a_i\leqslant m1⩽ai​⩽m,0⩽bi<n0\leqslant b_i<n0⩽bi​<n。 因为序列 bbb 单调不降,考虑从后往前算。每个数字只会被插入或删除一次,肯定是线性的。不过要考虑的是如何快速算出最多的小队。cnticnt_icnti​ 表示数 iii 出现了多少次,ccnticcnt_iccnti​ 表示次数为 iii 的数有多少个。 38
Rabbit 给定一棵树,共 nnn 个点,分别编号为 1∼n1\sim n1∼n。每次操作,你需要选出三个点 a,b,ca,b,ca,b,c 将他们标记,满足:ccc 是 aaa 到 bbb 简单路径上编号最大的点;a,b,ca,b,ca,b,c 两两不同;a,b,ca,b,ca,b,c 先前都没有被标记过。问至多能进行多少次操作。树上 ppp 到 qqq 的简单路径是指一个数列 a1,…,aka_1,\dots,a_ka1​,…,ak​,满足:1. a1=pa_1=pa1​=p,ak=qa_k=qak​=q;2. 其中没有重复元素;3. 对于所有 1≤i<k1\le i<k1≤i<k,ai+1a_{i+1}ai+1​ 与 aia_iai​ 有边相连。1≤T≤3×1041\le T\le 3\times 10^41≤T≤3×104,1≤n≤2×1051\le n\le 2\times 10^51≤n≤2×105,S≤6×105S\le 6\times 10^5S≤6×105。 考虑编号最大的点一定会成为一个 ccc,所以先考虑编号最大的点 xxx,但要怎么选 a,ba,ba,b 呢?可以考虑先删除这个点,裂成很多棵子树,先处理出它的子树,再看子树中有剩下节点的子树个数是否 ≥2\ge 2≥2(注意这里不是剩余节点个数,因为这个三元组必须包含 xxx)。而这样做的时间复杂度为 O(n2)O(n^2)O(n2),可以考虑倒过来做,先把编号小的点处理好,再用并查集慢慢往上连边。而若可以拆除下面的匹配来完成和 xxx 的匹配是没必要的,因为我们只关心最大匹配数,这样做对答案没有影响。时间复杂度可以做到 O(nα(n))O(n\alpha(n))O(nα(n)),其中 α(n)\alpha(n)α(n) 是并查集的时间复杂度。 39
CF1385C Make It Good 给定你一个长为 nnn 的序列 AAA ,请问要在这个序列中擦除长度为多少的前缀,才能使这个序列是一个好的序列。对好的序列的定义:假定有一个序列 BBB,你可以每次从序列的首项或末项取出一个数字放在序列 CCC 的末尾。假如存在一种方案使得 CCC 不降,那么 BBB 就是好的序列。 本题有 TTT 组数据。1≤T≤2×104,1≤∑n≤2×1051\leq T\leq 2\times 10^4,1\leq \sum n\leq 2\times 10^51≤T≤2×104,1≤∑n≤2×105 此题我们可以先从样例入手,观察样例中的好的序列,找到好的序列的规律,绘制成如下的图:从样例中的以上5幅分析图中,可以看出,好的序列分为几类:1.数列是有序的(升序降序均可)。2.呈一个先上升后下降的趋势(类似山峰的形状,或者说也可以有相邻元素出现相等,样例中告诉我们了)。于是我们可以从后往前扫,打标记,如果当前是降序就打上标记,代表已经不可能再出现升序了,如果出现打上标记并且出现升序了,就退出,然后我们把当前退出的位置-1就是我们要删除的数字前缀了(当然如果序列本身满足也没触碰到退出条件,自然退出,也不用担心出现负数)。 40
「TOCO Round 1」自适应 PVZ 有 nnn 只僵尸,第 iii 只僵尸在 lil_ili​ 时刻出现,会在 rir_iri​ 时刻走进房子。有 mmm 个豌豆射手。若一个豌豆射手在 lil_ili​ 至 rir_iri​ 时刻(不包括两个端点)持续攻击 iii 僵尸则可以杀死 iii 僵尸,但在攻击过程中不能攻击其他僵尸。求最少有几只僵尸会进入房子。 按照僵尸进入房子时间从小到大排序。可以假定 mmm 个豌豆射手的上次攻击时间 xxx 初始是 000,对于 111 只僵尸,若几个豌豆射手都能打,一定 max⁡(x)\max(x)max(x) 来打,因为如果后面出现了一个出现时间较早的僵尸,xxx 小的豌豆射手就能打。 41
AT195D Shipping Center 我们有 NNN个包裹和 MMM 个盒子,第 iii 个包裹的大小和价值分别是 WiW_iWi​ 和 ViV_iVi​。第 iii 个盒子最多只能装一个大小为 XiX_iXi​ 的包裹。给你 QQQ 组询问,每组包含两个整数 LLL和 RRR,请回答下列问题:在这 MMM 个盒子中,盒子 L,L+1,…,RL,L+1,\dots,RL,L+1,…,R 暂时不可用。请把包裹放进剩余的盒子(不一定要全放)并输出最大可能的总价值。1≤N,M,Q≤50,1≤Wi,Vi,Xi≤106,1≤L≤R≤M1\le N,M,Q\le 50,1\le W_i,V_i,X_i\le 10^6,1\le L\le R\le M1≤N,M,Q≤50,1≤Wi​,Vi​,Xi​≤106,1≤L≤R≤M 先把物品按价值从大到小排序,再把箱子按照容量排序,然后枚举每一个物品,尽量把它放在容量小的箱子里并且满足箱子不在不可用范围内,如果能放就打标记,把价值加到结果里。 42
牛奶供应(二) 有一家牧场,每天都会产出牛奶,在第 iii 天,牛奶的产量为 pip_ipi​ 。商人每天都会发来一张订单,在第 iii 天,商人的订单收购量为 cic_ici​,每天多余的牛奶会被保存下来加入库存中。订单具有两个特性,第一个是时效性,时效性是指,如果小爱不能在当天交货,则当天的订单就失效了。第二个是完整性,完整性是指,如果小爱的库存少于订单的需求量,则订单也是不能完成的。牧场收到订单时,可以忽略该订单,以满足其他订单需求。现给定 nnn 天,每天的牛奶的产量与订单的需求量,问牧场主最多满足多少张订单。1≤n≤105,1≤pi,ci≤1041\le n\le 10^5,1 \le p_i,c_i \leq 10^41≤n≤105,1≤pi​,ci​≤104 此题为反悔贪心,首先如果当前可以满足这个订单就满足,同时用 multisetpriority_queue来存订单的需求量的最大值,如果后面有需求更低的订单,我们就把这个订单毁掉,拿回牛奶,用于这个需求更低的订单(我们肯定希望剩余牛奶越多越好)。 44
CF902B Coloring a Tree 一棵树根顶点编号为 111 的树,每次可以选择一个子树染成同一个颜色,求染成目标状态的最小操作次数。2≤n≤1042\le n\le 10^42≤n≤104。 由于根节点终究是要改变的,如果它最后改变,会影响到它下面的点,故我们只要把父亲节点的颜色传给儿子节点,如果发现颜色不同,答案增加。 45
「一本通 1.1 练习 4」家庭作业 给定 nnn 个作业的完成期限和学分,求可以获得的最大学分。n≤106n\le 10^6n≤106,期限 <7×105<7\times 10^5<7×105 用优先队列来维护学分最多的作业,对所有作业先按时间从小到大,再按价值从大到小。每次压入一个作业的学分,发现队列长度 >>> 当前时间,删除队首元素,最后把队内所有元素相加。 46
AT155E Payment 给定正整数 NNN,设 f(x)f(x)f(x) 表示 xxx 在十进制下各个数位上的数的和,求一个正整数 xxx 满足 x≥Nx\ge Nx≥N 且最小化 f(x)+f(x−N)f(x)+f(x-N)f(x)+f(x−N)。1≤N≤1010000001\le N\le10^{1000000}1≤N≤101000000。 ​考虑直接贪心,每一位分别讨论,如果 >5>5>5,进 111 再减去;如果 <5<5<5,扣掉。否则判断后一位 ≤5\le 5≤5,进 111 位再减去,否则扣掉。 47
对答案 有 mmm 道判断题和 nnn 个人的答案( N\text{N}N 表示错,Y\text{Y}Y 表示对),有 xxx 个人得了满分,yyy 个人得了 000 分,还原出字典序最小的正确答案,无解输出 −1-1−1。其中 1≤n≤3×104,1≤m≤500,0≤x,y,x+y≤n1\le n\le 3\times 10^4,1\le m\le500,0\le x,y,x+y\le n1≤n≤3×104,1≤m≤500,0≤x,y,x+y≤n。 先用 hash\text{hash}hash 表预处理出每种字符串的出现次数,定义某个字符串的反串为每一位都与其不同的字符串,然后分类讨论。1. x>0x>0x>0,遍历已有的所有种类字符串,判断这种字符串的出现次数是否 =x=x=x 和其反串的出现次数是否 =y=y=y,取最小的字符串。2. x=0,y>0x=0,y>0x=0,y>0,同上,不过这里找的是全错的串,应该找最大的,取反。3. x=y=0x=y=0x=y=0,按照字典序遍历所有字符串(注意不管有没有人作答出这种答案),然后判断字符串和其反串是否均为出现。时间复杂度:O(nm)O(nm)O(nm) 49
珍珠帝王蟹 给定 nnn 个操作,每个操作可以令 x+ax+ax+a 或 x×ax\times ax×a,xxx 初始为 000,任意切换顺序,求 xxx 的最大值。1≤n≤105,1≤abs(a)≤1061\le n\le 10^5,1\le abs(a)\le 10^61≤n≤105,1≤abs(a)≤106 出正数与负数和。然后分两种情况:乘数无负数和有负数。 无则把正数和与所有乘数相乘,加负数和。否则再分两种情况:负乘数有奇数个和偶数个。1.奇数个则把最大的负数乘负数和,加正数和,乘剩下的所有乘数。2.否则把最大的负数乘正数和,加负数和,乘剩下的所有乘数。证明:奇数个要利用负数和,可以乘负数,为了使正数和能乘最大的数,而且负数先乘哪个数对负数的和没有影响,所以要使正数和能乘最大的数,让负数乘绝对值最小的负数,即乘最大的负数。偶数个则同理,只是把正变负,最后还是使总和成为正。 51
AT203E 一个 (2n+1)×(2n+1)(2n+1)\times(2n+1)(2n+1)×(2n+1) 的棋盘上有 mmm 个黑棋,你有一个白棋在 (0,n)(0,n)(0,n)。白棋在 (i,j)(i,j)(i,j),每次可以对白棋进行一下操作:1. 如果 (i+1,j)(i+1,j)(i+1,j) 没有黑棋,可以走到那。2. 如果 (i+1,j−1)(i+1,j-1)(i+1,j−1) 黑棋,可以走到那。3. 如果 (i+1,j+1)(i+1,j+1)(i+1,j+1) 黑棋,可以走到那。不能走出棋盘。问到 2n+12n+12n+1 行时能到多少个点。1≤n≤109,1≤n≤2×1051\le n\le 10^9,1\le n\le 2\times 10^51≤n≤109,1≤n≤2×105。 没有黑棋子的一行直接跳过,然后用 mapvector来代替原来的数组格式,再用 set来统计一下,每次如果发现到达点有 y+1,y−1y+1,y-1y+1,y−1 的情况的话,答案是可行,先存起来(不能和原来存在一起,待会还要考虑黑子挡在前方)。再一次遍历,如果发现 yyy被找到了,就要删除(黑子挡在前方),最后结果就是 set的长度。 52
AT218D 给定 nnn 个点,求有多少个由这些点组成的矩形平行于 xxx 轴和 yyy 轴。4≤n≤20004\le n\le 20004≤n≤2000。 考虑枚举矩阵左上角和右下角,让后开一个Map标记另外两个位置是否存在,最后个数要除 222(重复计数)。因为没想到得到矩阵的左上角和右下角坐标可以推出另外两角这条结论,所以没做出来。 53
糖果峡谷 给定 kkk 种区间,每种区间有起点、终点、个数,问最多能选择多少个区间,使得它们的交集不超过 ccc,起点、终点 ≤n\le n≤n。k≤2×106,n≤2×106,c≤2.1×105k\le 2\times 10^6,n\le 2\times 10^6, c\le 2.1\times 10^5k≤2×106,n≤2×106,c≤2.1×105。 先对区间按右端点排序,然后查询这段区间的最小值(即糖果格数),然后和区间数取最小,选取,然后把这段都减去最小值,考虑用线段树维护。 66
天才ACM 给定一个序列,定义 [l,r][l,r][l,r] 的校验值为从中取出 2m2m2m 个数(不够则取到不能取为止),使得“每对数的差的平方”之和最大。求至少将序列分成多少段,使得每段的校验值不超过 TTT。 这题真正把二分和倍增拉开差距了。如果用二分,每次需要 O(nlog⁡n)O(n\log n)O(nlogn) 的时间,那么如果段很小,那么需要 O(n2log⁡n)O(n^2 \log n)O(n2logn),如果用倍增,只需要将其拆解成 log⁡\loglog 段,每段是 O(nlog⁡n)O(n\log n)O(nlogn),那么则只需 O(nlog⁡2n)O(n\log^2 n)O(nlog2n),效率远超二分。如果再用二路归并优化,只对新增部分排序,那么可以进一步优化成 O(nlog⁡n)O(n\log n)O(nlogn)。 120

倍增

题目 题意 思路 代码
区间分段 给你一个长为 nnn 的序列 aaa 和一个常数 kkk 。有 mmm 次询问,查询区间 [l,r][l,r][l,r] 内所有数最少分成多少个段使得每段的和都 ≤k≤k≤k。无解报告 Chtholly 考虑进行预处理每个数如果只能有一段到达的位置,再进行倍增,最后倍增跳跃即可。 101
最优贸易简化版 给定一个长度为 nnn 的序列 aaa,mmm 次询问,每次询问区间 [l,r][l,r][l,r],求 max⁡{ai−aj},l≤j<i≤r\max\{a_i-a_j\},l\le j<i\le rmax{ai​−aj​},l≤j<i≤r 预处理每个点向后走 2j2^j2j 不的最小买入价格、最大卖出价格、最大收益。 -1
天才ACM 给定一个序列,定义 [l,r][l,r][l,r] 的校验值为从中取出 2m2m2m 个数(不够则取到不能取为止),使得“每对数的差的平方”之和最大。求至少将序列分成多少段,使得每段的校验值不超过 TTT。 这题真正把二分和倍增拉开差距了。如果用二分,每次需要 O(nlog⁡n)O(n\log n)O(nlogn) 的时间,那么如果段很小,那么需要 O(n2log⁡n)O(n^2 \log n)O(n2logn),如果用倍增,只需要将其拆解成 log⁡\loglog 段,每段是 O(nlog⁡n)O(n\log n)O(nlogn),那么则只需 O(nlog⁡2n)O(n\log^2 n)O(nlog2n),效率远超二分。如果再用二路归并优化,只对新增部分排序,那么可以进一步优化成 O(nlog⁡n)O(n\log n)O(nlogn)。 120
#mermaid-svg-Rb38DehoLmehUlAH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Rb38DehoLmehUlAH .error-icon{fill:#552222;}#mermaid-svg-Rb38DehoLmehUlAH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Rb38DehoLmehUlAH .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Rb38DehoLmehUlAH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Rb38DehoLmehUlAH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Rb38DehoLmehUlAH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Rb38DehoLmehUlAH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Rb38DehoLmehUlAH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Rb38DehoLmehUlAH .marker.cross{stroke:#333333;}#mermaid-svg-Rb38DehoLmehUlAH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Rb38DehoLmehUlAH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Rb38DehoLmehUlAH .cluster-label text{fill:#333;}#mermaid-svg-Rb38DehoLmehUlAH .cluster-label span{color:#333;}#mermaid-svg-Rb38DehoLmehUlAH .label text,#mermaid-svg-Rb38DehoLmehUlAH span{fill:#333;color:#333;}#mermaid-svg-Rb38DehoLmehUlAH .node rect,#mermaid-svg-Rb38DehoLmehUlAH .node circle,#mermaid-svg-Rb38DehoLmehUlAH .node ellipse,#mermaid-svg-Rb38DehoLmehUlAH .node polygon,#mermaid-svg-Rb38DehoLmehUlAH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Rb38DehoLmehUlAH .node .label{text-align:center;}#mermaid-svg-Rb38DehoLmehUlAH .node.clickable{cursor:pointer;}#mermaid-svg-Rb38DehoLmehUlAH .arrowheadPath{fill:#333333;}#mermaid-svg-Rb38DehoLmehUlAH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Rb38DehoLmehUlAH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Rb38DehoLmehUlAH .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Rb38DehoLmehUlAH .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Rb38DehoLmehUlAH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Rb38DehoLmehUlAH .cluster text{fill:#333;}#mermaid-svg-Rb38DehoLmehUlAH .cluster span{color:#333;}#mermaid-svg-Rb38DehoLmehUlAH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Rb38DehoLmehUlAH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

整数
前缀和优化
二分图的判定
容斥原理
实数
数学
堆+前缀和
数学
哈希
树+并查集
STL
sort
线段树
归并优化
28
29
34
36
37
39
42
45
49
50
51
66
73
101
119
120
倍增
-1
二分
30,35
33,37
31,32
排序
枚举
前缀和差分
贪心
38,40,47
41,44,46,52,53

其他算法和思想的题目相关推荐

  1. (第20讲)关于排序的各种算法的汇总的题目

    1.排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前 ...

  2. 卡尔曼算法笔记---思想和实际应用物理含义的理解

    此片blog的目的是理解卡尔曼算法的思想和实际应用的物理含义,想法很好,却只能理解冰山一角,先记下这一角 另本blog参考卡尔曼滤波 -- 从推导到应用和徐亦达卡尔曼推导视频 首先认识卡尔曼算法在数学 ...

  3. (十五)算法设计思想之“回溯算法”

    算法设计思想之"回溯算法" 回溯算法是什么? 什么问题适合用回溯算法解决? 适合回溯算法解决的问题 全排列 LeetCode:46.全排列 LeetCode:78.子集 思考题 回 ...

  4. (十四)算法设计思想之“贪心算法”

    算法设计思想之"贪心算法" 贪心算法是什么 LeetCode:455.分饼干 LeetCode:122.买卖股票的最佳时机II 思考题 贪心算法是什么 贪心算法是算法设计中的一种方 ...

  5. (十三)算法设计思想之“动态规划”

    算法设计思想之"动态规划" 动态规划是什么? 动态规划的步骤 LeetCode:70.爬楼梯 LeetCode:198.打家劫舍 思考题 动态规划是什么? 动态规划是算法设计中的一 ...

  6. (十二)算法设计思想之“分而治之”

    算法设计思想之"分而治之" 分而治之是是什么 场景一:归并排序 场景二:快速排序 LeetCode:374.猜数字大小 LeetCode:226.翻转二叉树 LeetCode:10 ...

  7. (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)

    文章目录 一:动态规划基本思想 二:弗洛伊德(Floyd)算法基本思想 三:弗洛伊德(Floyd)算法代码实现 四:弗洛伊德(Floyd)算法代码视频演示 五:弗洛伊德(Floyd)算法代码答题规范 ...

  8. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法局限性 二:迪杰斯特拉(dijkstra)算法基本思想 三:迪杰斯特拉(dijkstra)算法代码实现 四:迪杰斯特拉(dijkstra)算法代码视频演示 五:迪杰斯特拉(di ...

  9. (王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法基本思想 二:BFS算法代码 三:反思 最短路径shortestpath):主要有以下两类最短路径问题 单源最短路径问题:一个顶点到其他顶点最短路径 迪杰斯特拉算法(dijks ...

最新文章

  1. 概率统计笔记: 协方差与相关系数
  2. 前端技巧:遍历数组都有哪些方式呢?
  3. 数学:莫比乌斯反演-约数个数和
  4. js关于表单校验完善
  5. FPGA _Verilog HDL_计数器实现数字钟60秒计数设计实验
  6. java获取教务系统成绩,Java httpClient 正方教务管理系统模拟登陆,爬取学生成绩和培养计划...
  7. oracle 11g 通过在线重定义方式修改表结构
  8. [redis读书笔记] 第二部分 单机数据库 数据库实现
  9. POJ2403 Hay Points
  10. AVRNET 学习笔记UDP部分
  11. hermite插值法 matlab,分段三次Hermite插值Matlab实现
  12. zipf定律 齐普夫定律
  13. Donet.HighCharts
  14. 2019年京东面试题-洗咖啡杯问题【贪心和动态规划】
  15. 开发一个App大概要多少钱?
  16. Bandwagon Host IP Change修改IP
  17. 从JSP跳转到Servlet的两种方式
  18. html使表格位于页面的右下方,在 HTML 页面中,要显示如下图所示的表格,应在下方 HTML 代码的下划线处填写()。 table border=”1” trtd =”2” 性别 /...
  19. 服务注册中心之Eureka简介及原理
  20. 基于SpringBoot 适合学习的开源社区平台

热门文章

  1. c#字典dic的用法总结
  2. 清明小假去哪玩?不出深圳也好玩的特色农家乐团建有哪些?
  3. 旧文重发 | 爬虫工程师必须知道的几个法律案例
  4. (基础很弱的人)如何学好英文
  5. 海康威视人脸识别设备对接(一)环境搭建
  6. 如何找到root模式下的.bashrc
  7. 小六六读Effective记录
  8. 山东中职计算机专业考本科,山东省教育厅下通知:中职生今后不能再考本科
  9. (小技巧)在IDEA里面添加快捷输入,提高开发效率
  10. R语言实现LDA算法(鸢尾花)