
线段树
文章平均质量分 62
天翼之城*
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Codeforces 1638 E. Colorful Operations —— 线段树+暴力,有丶东西
This way题意:给你一个长度为n的数组a,一开始所有位置的颜色都为1,值都为0.每次有三种操作:Color l r x:把[l,r]中的所有位置颜色变成xAdd c:把颜色为c的所有位置的值加上cQuery i:问i位置的值是多少。题解:这个感觉还是有点绕的,我也是想了比较长的一段时间。最后在通过某位大佬的代码证实了我的想法之后才敲的,要不然我敲崩了又没有借鉴可以参考,非常难受。首先这种区间变换的题目,很容易就能想到是区间修改,但是有的时候也不一定,所以我在决定做法的时候还是犹豫了一原创 2022-03-02 10:54:30 · 591 阅读 · 0 评论 -
Codeforces 1632 D. New Year Concert —— 线段树+尺取
This way题意:给你一个长度为n的数组,你要修改其中的某些值使得任意的l,r,gcd(a[l],a[l+1]...a[r])==r−l+1gcd(a[l],a[l+1]...a[r])==r-l+1gcd(a[l],a[l+1]...a[r])==r−l+1的情况不存在。对于所有的前缀都做一遍。题解:这道题…解题思路在题目中提到了:枚举所有右端点,然后检查左端点。具体是检查什么,怎么检查。那么我们第一个可以发现的是答案一定是不会减小的,因为你要能让i这个位置满足,必然要让前面的位置也满足原创 2022-02-04 18:20:23 · 384 阅读 · 0 评论 -
Codeforces 1552 E. Colors and Intervals —— 贪心,sorting(双语)
This way目录题意:题解:C++代码:Python代码:题意:给你n*k个数a,每个数的值都在[1,n]之间,且每种值正好有k个,让你输出n个区间,1.第i个区间xi,yix_i,y_ixi,yi要满足a[xi]=a[yi]=ia[x_i]=a[y_i]=ia[xi]=a[yi]=i。2.且对于数组里面所有的数,它最多只能被包含在⌈nk−1⌉⌈\frac{n}{k−1}⌉⌈k−1n⌉个区间里。题解:其实平时做到这种题目就是连蒙带猜写的…感觉上答案对了且暂时找不到反例就写写试试原创 2021-08-07 15:07:02 · 234 阅读 · 0 评论 -
Codeforces 1486 D. Max Median —— 求长度>=k的满足要求子串的通解
This way题意:给你一个长度为n的数组,问你长度大于等于k的子串中的中位数最大是多少题解:上次做到过一道求平均数最大的,但是我忘记怎么做了,这次又花了一点时间去想。那么感觉这种题目都有一个通解,就是二分+线段树。首先是二分答案,然后在线段树上区间+当前值是否大于等于mid,那么线段树的叶子就表示这个后缀的中位数是>=mid还是<mid。接下来就查询1~i-k+1这个区间的最大值是否大于0即可。那么对于平均数的题目的话,我们可以区间+a[i]-mid,然后查询1~i-k+1这个原创 2021-02-25 14:59:40 · 201 阅读 · 0 评论 -
Codeforces 447 E. DZY Loves Fibonacci Numbers —— 斐波那契数列性质+线段树
This way题意:对于不同的数没有办法直接区间加,那么要了解斐波那契数列的一个性质:假设a[n]=a[n-1]+a[n-2]那么a[n]=f[n-1]*a[2]+f[n-2]*a[1](f表示斐波那契数列)∑i−1na[i]=a[n+2]−a[2]\sum\limits_{i-1}^{n}a[i]=a[n+2]-a[2]i−1∑na[i]=a[n+2]−a[2]那么更新的时候,我们只需要知道每个位置的a[1]和a[2]即可,而这个也是可以快速地得到的,求区间和可以直接用上面的方法#in原创 2021-01-07 15:18:46 · 211 阅读 · 0 评论 -
Codeforces 1469 F. Power Sockets —— 二分+线段树,贪心
This way题意:现在有一个根节点,和n条包含a[i]个节点的链。一开始所有点的颜色是白色的。你每次可以做以下操作:找到树中某个白色节点,拿出一条链,将这个节点和链上某个节点连接,并且这两个点的颜色变成黑色,之后这条链属于树中一个部分。你可以合并任意的链,问你离根节点第k远的白色点的深度最小是多少。题解:首先知道了一点:加入一条链的时候,两个白点会变成黑色,那么长度小于等于2的必不用加入。并且长的链在前面一定是更优的,因为短链在前,再加长链的话,会使得更多的白点深度增加。链接树上的白点原创 2021-01-01 21:34:10 · 395 阅读 · 2 评论 -
Codeforces 1422 F. Boring Queries —— 线段树+主席树,数据大小使用不同方法
This way题意:给你n个数,每次问你区间l~r的所有数的lcm题解:对于每一种质因子,我们只需要取出幂次最高的一个组成lcm就行了,比如6,2,8,9那么2最大是3次,3最大是2次,因此lcm是23∗322^3*3^223∗32同时我们可以知道>sqrt(2e5)的质数的次数最多只有一次。那么此时我们可以使用主席树来维护一段区间中>sqrt(2e5)的所有不同的质数的积。然后可以发现<=sqrt(2e5)的质因子只有80+,于是我们可以使用90颗线段树维护区间最大原创 2020-12-22 15:02:45 · 240 阅读 · 0 评论 -
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)J Just Another Game of Stones ——线段树区间更新小于x的数
This way题意:给你n个数,每次有两种操作:1 l r v 表示a[i]=max(a[i],v)[l<=i<=r]2 l r v 简单来说就是问你v和a[i](l<=i<=r)的异或和,得到x,然后输出多少个数含有x的最高位题解:对于第一个询问,首先如果要更新的区间的数参差不齐,那么在单点更新一次之后,下限就会上来,那么更新过的点我们想办法之后不要直接单点更新。于是用mi表示当前区间的最小值是什么,num_mi表示当前区间最小值有多少个。这样子如果我们接下来要原创 2020-12-21 21:27:27 · 443 阅读 · 0 评论 -
Codeforces 1217 F. Forced Online Queries Problem —— 又见 线段树分治+并查集
This way题意:每次给你两个操作:1 x y 表示加/断点x和点y之间的连边2 x y 问你x和y是否连通题解:在线的做法好像是什么ETT?不是很懂这题是个假的强制在线,只需要一开始将所有情况处理出来放到线段树里面,dfs线段树的时候查看当前操作是否合法即可。那么又是将询问当做叶子结点,操作当做区间更新,然后向下dfs的时候更新一下并查集即可。#include<bits/stdc++.h>using namespace std;#define pa pair<原创 2020-12-21 19:33:48 · 234 阅读 · 0 评论 -
15届黑龙江省赛 B. Bills of Paradise —— 线段树
This way题意:题解:对于前三个都可以用权值线段树,对于R操作,我们可以直接在D操作删除的时候用一个优先队列来存有哪些数被删掉了。时间复杂度可以保证是因为每个数被加进来都需要一次操作,所以不会超过n次操作R。线段树较为庞大,敲代码时应当更注意细节,例如在D操作的时候,return之前应当push_up#include<bits/stdc++.h>using namespace std;#define ll long long const ll mod=999999999原创 2020-12-14 12:26:23 · 448 阅读 · 0 评论 -
Gym 102875 A. Array —— 记录变化状态的线段树,有丶东西
This way题意:题解:看到了幂次…如果要用二项式展开来做会很麻烦。然后发现其实总共的数不会超过30个,那么我们开线段树记录每个区间值为x的数有多少个,然后更新的话,直接记录每个数转移成了什么数(f数组的意义)那么num[root<<1][f[root][i]]=num[root<<1][i]这样子去做就行了。计算幂次的话,由于p不一定是个质数,直接取模会出错,并且如果在线段树里面快速幂的话,时间复杂度会很大,因此我们在输入k之后,如果op==3,将所有数的k次直原创 2020-12-12 20:07:06 · 234 阅读 · 1 评论 -
Codeforces 1348 F. Phoenix and Memory —— 贪心,权值线段树,有丶东西
This way题意:现在有n个人,他们可行的取值范围是li~ri。让你构造一个排序使得它符合每个人的范围,问你这个排序是否是独一无二的。题解:首先找一个排序的话,只需要从小到大枚举值,然后查看当前有哪些人包含这个值,将右端点最小的那个人赋予这个值即可。因为这必然是最优的,取右端点最小的话,剩下的人的选择机会更多。对于是否独一无二的问题,我们只需要选择两个人,使得max(lef[i],lef[j])<=v[i],v[j]<=min(rig[i],rig[j]),就像下面这个样子:原创 2020-12-10 18:05:28 · 207 阅读 · 0 评论 -
Codeforces 1380 F. Strange Addition —— 线段树优化矩阵快速幂
This way题意:现在有一种加法,假设上面是1,下面是b,那么他们相加得到的c是这个样子的:现在给你一个数组c,并且有多次修改每个位置的数字是什么,问你每次修改完之后,问你a+b=c有多少种a,b数组题解:假设这个数组是a,设b[i]=a[i-1]*10+a[i]设v[i]表示当前值为i的时候,有多少种加法方式那么可以写出dp[i]=dp[i+1]*v[a[i]]+dp[i-2]*v[b[i]]但是有修改,所以不能直接做,由于是单点修改,那么此时我们可以将其放到线段树当中,在上传时重原创 2020-12-09 18:40:59 · 230 阅读 · 0 评论 -
Codeforces 1389 F. Bicolored Segments —— DP+线段树,有丶东西
This way题意:现在有n个线段,每个线段有一种颜色,定义一对线段是“坏的”,当且仅当这对线段i,j满足以下条件:1.c[i]!=c[j]2.i和j相交(包括边界)问你最多能选择多少线段使得其中没有任何一对线段是坏的题解:先后想了三种方法,花了我两个半小时接下来假设颜色为0,1首先我得到一个结论,就是c[i]只会从c[i]^1的地方转移过来。因为如果从相同颜色的地方转移过来,会有很多很烦的情况(或许是我菜了),刷掉了我前两个想法。那么怎么找这个转移的位置,可以用线段树来查询最大值原创 2020-12-08 21:40:51 · 213 阅读 · 0 评论 -
Codeforces 1439 C. Greedy Shopping —— 线段树,有丶东西
This way题意:现在有n个物品,每个物品的花费为ai,并且a序列非增。现在有两种操作:1 x y 让ai(1<=i<=x)这些物品的花费变成max(ai,y)2 x y 一个人现在有y块钱,他会从x走到n,如果能买下物品就买,问你买了几个物品题解:题意看错,我没有看到非增这个约束,变成了另一道题目。于是的话,我们只需要用sum维护区间和,mi表示区间最小值,mx表示区间最大值那么更新的时候,只需要判断当前的最小值是不是大于等于当前值,如果是的话,就说明不用更新了,如原创 2020-11-25 17:45:54 · 2176 阅读 · 0 评论 -
Codeforces 1428 F. Fruit Sequences —— 线段树求所有区间最长子串和
This way题意:给你一个01串,设f(l,r)表示区间l到r中最长的全1子串的长度。问你题解:首先遇到这种题目就知道是应该枚举一个端点然后快速地进行计算。然后发现,如果从左往右删数的话,假设当前连续的1的最长长度是x,那么直到下一次出现长度是x的位置为止,所有的位置值-1.就像这个图,蓝色的部分都要-1.于是我们用线段树查找连续的1的长度的位置。sum表示当前开头的答案。#include<bits/stdc++.h>using namespace std;#d原创 2020-11-10 16:12:08 · 255 阅读 · 0 评论 -
Codeforces 1373 G. Pawns —— 线段树优化
This way题意:现在有一张n*n的格子,每次会在x y位置加一个点,如果这个位置有点了就删掉,每个点每次能够往走一格,最终到达第x行,并且每个格子只能有一个点。问你每次加入点之后,至少要在n列的基础上加多少列才能让所有点都走到第k行。题解:那么这道题目翻译一下就是,给你x y相当于现在有一个横轴,你要在第abs(x-k)+y个位置及之后找一个位置上没没有点并且能够装下它。那么暴力的找肯定是不行的,想了很多解法都是要么时间复杂度太大,要么不满足性质,但是它相当于单点修改,于是可以考虑线段树原创 2020-11-01 12:28:30 · 180 阅读 · 0 评论 -
Codeforces 1418 G. Three Occurrences —— 线段树,标记永久化
This way题意:给你一个长度为n的串,问你有多少个子串,使得这个子串中所有种类字符都正好出现3次题解:首先我们考虑对于每一个右端点,都有一个左端点的区间使得它合法。那么我们枚举所有右端点,询问合法的左端点的区间中有多少合法的位置。那么首先考虑线段树,对于当前枚举到的右端点,首先将它距离上一个这个种类的字符的位置的不合法度+1(f表示不合法的区间个数)。然后再将从右往左第4个到第3个区间中的位置不合法度-1,并且将1~从右往左第四个这个区间的不合法度+1.由于之后前面的区间绝对不合法,所以原创 2020-09-22 15:27:32 · 263 阅读 · 0 评论 -
Codeforces 1401 F. Reverse and Swap —— 线段树,区间翻转
This way题意:给你一个长度为2n2^n2n的数组,有4种操作:嗝太长了,自己看一下吧题解:我一开始还想着用FHQ Treap,没仔细考虑时间复杂度,如果2,3操作每次k都是0的话,就是n2logn^2logn2log的时间复杂度。然后的话,由于是简单翻转没有插入删除,于是可以用线段树,区间打上翻转标记就行了,第二种和第三种有一些区别。操作二的话,就需要在深度为k以及之后的所有深度都打上左右互换标记,这样的话,就能表示区间翻转了操作三的话,需要在深度是k+1的位置打上左右互换标记就原创 2020-09-12 18:32:23 · 286 阅读 · 0 评论 -
Codeforces 1401 E. Divide Square —— 线段树
This way题意:有一个矩形在平面上,它的左下右上角是(0,0),(1e6,1e6)现在给你一些水平或者竖直的线段,在这个矩形内部并且至少有一端和这个矩形相交,问你这些线段将这个矩形分成多少个部分题解:我们枚举每个竖直的线段,然后查看它和多少个水平的线段相交,由于每个线段一定都和矩形相交,那么这个线段在内部的相交数就是它的贡献(这道题应该去年做到过)并且两端都与矩形相交的线段,它的贡献会增加1.#include<bits/stdc++.h>using namespace原创 2020-09-06 13:23:13 · 116 阅读 · 0 评论 -
Codeforces 1398 F. Controversial Rounds —— 线段树+dp
This way题意:给你一个字符串,有些位置是已知的,有些是未知的,从位置1开始,如果有连续的0或者1大于等于k个,那么就算一轮游戏,然后0,1重新计数。问你当k=1~n的时候,游戏轮数最多是多少。题解:首先发现,这个是可以用调和级数做的,并且感觉也是正确的,于是考虑这个做法:对于当前位置,至少要多少个数才能进行一轮游戏。我们可以发现贪心必定是正确的,因为01数量会清空,所以结束的越早越好。那么对于这个做法,我们考虑从后往前DP:dp[i][j]表示到了第i个位置,连续的0/1数量最多是多少原创 2020-09-05 18:01:44 · 916 阅读 · 1 评论 -
Hdu 6856 Breaking Down News —— 权值线段树+DP
This way题意:现在有一个长度为n的数组,你要将其划分成一些连续的区间,每个区间的长度在l~r之间,每个区间的贡献是:-1:这个区间的和小于00:这个区间的和等于01:这个区间的和大于0问你最后总的贡献最大是多少题解:我想用几个set来维护…但是失败了,有点难写。确实用权值线段树的话会方便很多dp[i]表示到了第i个位置的答案最大是多少首先我们知道对于第i个位置,有最多三种转移的可能:dp[i]=dp[j]-1,dp[i]=dp[k],dp[i]=dp[l]+1那么其实就对应三原创 2020-08-26 10:11:37 · 228 阅读 · 0 评论 -
Codeforces 935 F. Fafa and Array —— 线段树
This way题意:给你一个长度为n的数组a,定义f:每次有两种操作:1 l r x 让你在l~r区间中选一个位置,将那个位置的a值+x之后,f最大是多少2 l r x 将区间l~r的所有a值+x题解:区间问题,首先考虑数据结构由于它是绝对值的和,所以要分成很多情况,写起来好累我们可以知道线段树维护的是a[i]-a[i+1],假设经过处理的数组数b对于1操作,假设我们要加的位置是p,那么我们要尽量让b[p-1]尽量<=0,b[p]尽量>=0,因为这个样子我们能够加的值就原创 2020-08-25 13:28:31 · 196 阅读 · 0 评论 -
ZOJ 3943 Himalayas —— 线段树优化,有丶东西
This way题意:告诉你n座山的高度,第i座山被称为山峰当且仅当1<i<n∩Hi−1<Hi>Hi+11<i<n ∩H_{i-1}<H_i>H_{i+1}1<i<n∩Hi−1<Hi>Hi+1每次都有一个操作:让区间l~r的山每座山的高度加上A+(i-l)*B问你每次操作完之后有多少山峰题解:首先看到区间加上等差数列就知道基本上就是用线段树维护前后差值。老套路了那么区间更新的时候就更新三个区间的值:L~L (+原创 2020-08-16 17:55:28 · 193 阅读 · 0 评论 -
2020牛客暑期多校训练营(第九场)C Groundhog and Gaming Time —— 期望+线段树,长度平方期望的求法,有丶东西
This way题意:现在有n个线段,每个线段有1/2的可能会被选中,问你被选中的这些线段的交集的长度的平方的期望是多少。题解:对于求这种期望我是一窍不通,理解别人的代码也理解了好久才恍恍惚惚好像知道了的样子,难受首先我们可以将所有的线段分成一个一个小段,然后去做每个小段的贡献:比如说这三个黑色线段我们就可以将他们分成一个一个红色的小段。然后对于每一个小段p的贡献:假设有x个线段包含这个小段=∣p∣∗∑i∈xsegmenti∗2x−12n∗∣segmenti∣=|p|*\sum\lim原创 2020-08-12 10:27:22 · 305 阅读 · 1 评论 -
2020牛客暑期多校训练营(第八场)A All-Star Game —— 线段树分治+并查集,关于unordered_map自定义pair_table
This way题意:现在有n个球员,m个球迷,定义第i个球迷喜欢第j个球员当他满足以下条件之一:1.第i个球迷和第j个球员有连边2.第i个球迷和第k个球员有连边,且第L个球迷和第k个球员有连边且第L个球迷和第j个球员有连边现在告诉你一开始球员球迷连边情况,并且接下来有q个询问,每次告诉你球迷x和球员y,如果他们没有连边,就连边,如果有连边就断掉。每次操作结束后,问你最少需要几个球员才能连上所有的球迷。题解:赛上没时间看这道题目了,赛后发现这道线段树+并查集的经典题目,上一次这种想法是CF原创 2020-08-05 15:56:08 · 301 阅读 · 0 评论 -
Codeforces 992 E. Nastya and King-Shamans —— 2个线段树,求前缀和+求第一个大于等于val的位置,斐波那契数列的性质
This way题意:给你一个长度为n的数组,q次操作,每次操作给你x v 将位置x的值改成v并且在每一次操作之后你要输出一个位置x(1<=x<=n||x=-1)使得a[x]=∑i=0x−1a[i]\sum_{i=0}^{x-1}a[i]∑i=0x−1a[i]。如果不存在输出-1.题解:首先考虑是数据结构,那么我们怎么维护某个值和它前缀和的关系?想了一会发现不知道怎么维护,那么改变策略。此时我发现,有可能的位置的序列一定是一个a值单调递增上升的序列。那么根据斐波那契数列的性质,我原创 2020-08-02 19:10:13 · 245 阅读 · 0 评论 -
2020牛客暑期多校训练营(第六场)J Josephus Transform —— 权值线段树求约瑟夫环置换,O(n)求x次置换之后的位置
This way题意:现在有n个人,然后有m次操作,每次操作都做长度为k的约瑟夫,然后再按照淘汰的顺序再做约瑟夫,直到x次。问你最终的序列是怎么样的。题解:这种题目我就不是很懂。首先用权值线段树O(nlogn)O(nlogn)O(nlogn)求出置换。只要每次查看当前位置后面的值够不够,如果不够的话,减掉后面值的个数,然后回到1,然后求从p开始有now个还存在的数的位置。置换求出来了之后,好像可以用倍增做,但是也有可以快速求经过了x步的做法,然后置换是有两种表示形式的:就拿第一个样例来举例子原创 2020-07-28 19:06:51 · 219 阅读 · 0 评论 -
2020牛客暑期多校训练营(第五场)H Interval —— 主席树+线段树,位与,有丶东西
This way题意:定义F(l,r)=Al&Al+1&...&ArF(l,r)=A_l\&A_{l+1}\&...\&A_rF(l,r)=Al&Al+1&...&ArS(l,r)S(l,r)S(l,r)为F(a,b)(l<=a<=b<=r)F(a,b)(l<=a<=b<=r)F(a,b)(l<=a<=b<=r)的不同元素的个数。每次给你l,r问你S(l,r)的值题原创 2020-07-27 19:39:07 · 510 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场)C sequence —— 笛卡尔树模板+线段树
This way题意:问你题解:遇到这种题目一定是先做最小的点所覆盖的区间,依次这样递归下去。这时候就有一个快速知道当前最小的点的位置以及区间的做法:笛卡尔树以下的讲解是基于顺序为下标,排序为最小值最优。笛卡尔树就是一个类似二叉搜索树的二叉树,首先用一个单调栈来维护从根开始的最右链,然后每次进来一个位置i,依次pop直到找到第一个小于等于a[i]的位置,将那个点的右儿子标为i,i的左儿子为刚才栈中第一个大于i的位置。void build(){ for(int i=1;i<=原创 2020-07-24 13:14:53 · 267 阅读 · 0 评论 -
2020牛客暑期多校训练营(第四场)A Ancient Distance —— 整除分块类似,线段树,想法,有丶东西
This way题意:现在有一棵树,假设你现在可以设置树中k个点为关键点,使得最后每个点到根的路径中距离它最近的关键点的距离的最大值最小。问你k从1到n的所有答案的和。题解:这道题有点难,牛客的标准解法我先不做,因为这个代码写起来很长,然后我就去找有没有比较短一点的做法,于是我就找到了一个很厉害的做法,分块上做线段树,这个时间复杂度应该也是O(nlog2n)O(nlog^2n)O(nlog2n)级别的。首先我们要知道,当答案一定的时候,是会有多种k的,比如说一条长度为4的链,放2个关键点和3个关原创 2020-07-22 14:34:27 · 333 阅读 · 0 评论 -
2020牛客暑期多校训练营(第四场)E Eliminate++ —— 线段树优化
This way题意:给你一个长度为n的排列,你每次可以取一个长度为3的子串,然后消掉最大和最小的数,直到最终剩下一个数,问你每个数是否可能是那个数。题解:那么我们肯定是枚举每个数,然后查看有多少数大于他,有多少数小于它。如果这些是相同的,那么每次就可以找连续三个数使得有一个大于它,一个小于它,然后直到消到最后。那么如果不相同,我们就可以消掉连续三个大于它或者连续三个小于它中的两个。接下来用1表示大于当前数,0表示小于。但是不能每次只看连续的三个相同数,比如11011这个串,就可以先消掉一个0原创 2020-07-20 20:05:03 · 429 阅读 · 0 评论 -
Codeforces 1186 F. Vus the Cossack and a Graph —— 线段树,贪心
This way题意:现在有一张简单图,n个点m条边,让你留下最多⌈n+m2⌉\lceil{\frac{n+m}{2}}\rceil⌈2n+m⌉条边,假设每个点的当前度数为di,每个点的最终度数要大于等于⌈di2⌉\lceil{\frac{d_i}{2}}\rceil⌈2di⌉。问你留下来哪些边题解:我最近做题目都先考虑线段树是否能做…不知道这是不是一个好习惯,但是这道题依旧还是用线段树过了。首先我考虑减少当前度数最大的点的边,然后和这个点相连的那些点应该删谁?如果删除度数较大的那个的话:原创 2020-07-17 16:26:51 · 276 阅读 · 0 评论 -
Codeforces 1187 D. Subarray Sorting —— 线段树,贪心
This way题意:现在有两个数组,并且你每次可以做一个操作:选择一个区间,并且排序。问你对上面这个数组做一些操作之后是否能得到下面这个数组。题解:那么如果每次选的区间大小为2,那么就像是一个冒泡排序了,将一个大的值依次向后传并且保持其他的值顺序不变。那么我们只需要从后往前枚举一遍b数组,然后查看a数组对应的bi的值的最后一个位置到n的最大值是否有一个数大于他。如果有就不行,因为他没有办法交换到后面去。如果行那就将这个值去掉,因为它已经排好了。我用线段树维护最大值。#include<原创 2020-07-17 14:11:37 · 185 阅读 · 0 评论 -
COCI ACM —— 线段树+枚举
This way题意:现在哟n道题目,有三个人对这些题目打分(1~5),现在要将这n道题目划分为3个连续的区间,分配给这三个人去做,每个人的值就是他对于他负责的区间的打分的值的和。问你所有人的值的和最小是多少。题解:那么其实这道题的解法很明显,首先每个人有先后顺序,但是只有3个人,所以可以暴力枚举每个人的先后情况。然后对于当前的情况,我们可以枚举第一个人负责的区间到哪,然后找到后面区间的最优分配方法,那么设后面的每个位置的值是bi−cibi-cibi−ci,然后维护一个前缀和,找到其中的最小值就原创 2020-07-16 16:03:01 · 255 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场)H Happy Triangle —— 权值线段树,离线
题意:现在有一个multiset,每次有三种操作:1 x 往multiset里塞一个x2 x 删掉multiset里的一个x3 x 询问是否能从multiset中找出两个数使得他们和x能够构成一个非退化三角形题解:那么这道题我一看他就是个权值线段树,但是由于一些小bug,我调了几个小时,最后靠着队友的强力对拍才找到。。。太难了首先我们知道对于操作3,有两种情况:1.x是最大的边:那么就从set中找到比x小的最大的两个数判一下2.x不是最大的边:那么就从权值线段树中找区间是x~all的这些原创 2020-07-15 19:39:16 · 212 阅读 · 0 评论 -
Codeforces 1114 F. Please, another Queries on Array? —— 线段树优化+欧拉函数的一些性质
This way题意:给你n个数,每次有两种操作:TOTIENT l r 问你从x到y区间MULTIPLY l r x 将l到r的区间的值乘上x题解:对于欧拉函数来说1.如果x,y互质φ(x∗y)=φ(x)∗φ(y)φ(x*y)=φ(x)*φ(y)φ(x∗y)=φ(x)∗φ(y)2.如果p是质数φ(xy)=xy−xy−1φ(x^y)=x^y-x^{y-1}φ(xy)=xy−xy−1那么乘上一个数我们可以用唯一分解定理将它分解变成1之后,再对每个质数用2去做。但是很明显不能O(n)的去做原创 2020-07-14 20:17:36 · 208 阅读 · 0 评论 -
RELATIVNOST —— 线段树优化
应该能进得去题意:现在有n个人要买你的画,第i个人最多买ai个彩色的画,bi个黑白的画,你现在想要至少有c个人买了彩色的画,接下来有q个修改,每次修改某个人的ai和bi。问你每次修改之后有多少种情况可以满足你的要求。题解:又是一道线段树优化的dp,因为c只有20所以我们将题目变成:所有情况-买你彩色的画的人的个数少于c个的情况。也就是∏i=1n(a[i]+b[i])−∑i=0c−1dp[n][i]\prod_{i=1}^{n}(a[i]+b[i])-\sum_{i=0}^{c-1}dp[n][i]原创 2020-07-10 09:57:37 · 241 阅读 · 0 评论 -
NEKAMELEONI —— 线段树优化
This way题意:给你n个数,每个数的值不超过k,接下来有m个询问,有两种操作:1 x v表示将位置x的值变成v2 输出包含1~k的所有值的区间题解:这个一看就是尺取,但是尺取的时间复杂度太大,然后又有单点更新,然后的话又可以将状态合并,可以用线段树优化。线段树求答案的时候肯定是左子树的后缀加上右子树的前缀来搞,那么我们就需要维护前后缀上每个值的位置,但是如果单个值去维护的话,检查又要花掉时间。此时发现k=50,那么可以用longlong来维护所有的状态,这里不是说2502^{50}250原创 2020-07-09 19:45:42 · 209 阅读 · 0 评论 -
Codeforces 1251 E2. Voting (Hard Version) —— 线段树,找区间最小值的位置
This way题意:现在有n个人,每个人都有两个值p,m,你现在要买通所有人,第i个人会跟随你当且仅当你买通的人的个数>=mi或者用pi去买通他。问你最少要花多少钱去买通所有人。题解:先对所有人按照m从小到大排序,因为我们买通的人一定是从少到多的。然后到第i个人的时候假设我们把前面i-1个人都已经买通了,看看还差多少人,这个数字就是我们需要在i~n这些人中买通的人的最少个数。这样的正确性在于所有的m<n,并且因为我们已经排序了,后面的人的m一定是大于等于当前的人的,对于第i个人如果不能原创 2020-07-08 09:47:09 · 612 阅读 · 0 评论