
思维
文章平均质量分 50
_kikyou-
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Codeforces Round #757 E. Divan and a Cottage(非递减权值线段树+标记永久化)
传送门给出了n天的室外温度t[i],同时规定,如果第i天早上的室内温度为P,那么当t[i]>P,第i+1的室温变为P+1,如果小于,则变为P-1,等于则仍然是P。按照样例解释一下输入的信息:首先输入n,代表有n天,接下来是n组信息,代表每天的室外温度以及询问每组信息由室外温度t、询问个数k、k个询问组成。对于第i组信息,首先给出室外温度t[i],然后给出k,接下来是k个询问,每个询问是一个非负数x[j],表示如果第一天早上的室温是x[j],那么第i天结束后,室温是多少? 比如第三组信息,首原创 2021-12-06 20:48:22 · 693 阅读 · 0 评论 -
D. Dogeforces (贪心构造+并查集维护生成树)
传送门有一个有根树,带点权,最多500个叶节点,满足根到叶子单条链上的点权严格递减 同时告诉了每对叶节点(i,j)的lca的点权,构建一棵符合条件的树。首先这个题肯定是从叶子节点往上去构建一棵树的过程,想到可以用并查集来维护,fa[u]就表示u往上走目前到达的点,我们把(i,j,lca(i,j))三元组按点权升序排序,点权相同则按顶点编号排序。枚举排好序的三元组,对于(u,v,w),有两种情况。先求出u v的根节点r1 r2 ,如果小于w 说明u v的lca的点权就是w,n+=1表示新建一个节原创 2021-11-19 21:45:26 · 337 阅读 · 0 评论 -
codeforces 939E - Maximize (三分 / 双指针)
传送门题意:给定一个空集合S,操作1是每次加入一个数,保证不会小于当前集合的最大数,操作2是询问,从该集合选出一个子集,满足子集最大值减去元素平均值最大,输出这个最大值。1<=q<=5e5首先可以感性地想到选出来的子集的2个性质,①选出来的最大元素一定是集合S的最大值,即:每次都选最新加入的元素。②其余的元素是集合S的一个连续的前缀(按升序排列之后) .为什么呢?①:②:如果我们选的是s[1],s[2],s[4],s[5],那么如果我们用s[3]去代替s[4],总和一定会减小,原创 2021-11-15 22:27:18 · 599 阅读 · 0 评论 -
CF319B Psychos in a Line (单调栈+dp)
传送门给定一个序列,如果第i个数比第i+1个数大,那么就会吃掉第i+1个数,吃与被吃同时发生,每一次吃看作一轮,问多少轮后可以稳定下来。dp[i]表示i位置被吃的时候是第几轮,(0表示不会被吃,初始记为1)对于i,我们从i-1的位置往前遍历,假设遍历到位置j,如果a[j]<=a[i],那么dp[i]=max(dp[i],dp[j]+1)否则当a[j]>a[i], 直接退出循环不需要更新此外,如果a[i]是前i个里面最大的,dp[i]=0转移过程可以用单调栈,不断原创 2021-11-09 15:44:55 · 202 阅读 · 0 评论 -
D. Bash and a Tough Math Puzzle (线段树+dfs剪枝)
传送门给定序列,单点修改,区间询问[l,r]中,能否最多修改一个数使得区间GCD等于x。(询问时的修改只是想象中的修改,不会改变序列的元素)线段树维护区间gcd这个很显然了,问题是询问如何处理呢?刚开始的方向是找满足条件的序列,有什么规律性质,但是在纸上画了很久也没有结果。可以说方向完全错了。...原创 2021-11-08 23:34:54 · 119 阅读 · 0 评论 -
Lawn of the Dead (线段树)
传送门给定一个n*m的网格,有k个地雷,不能踩到地雷所在格子,从(1,1)出发,只能往左或者往下走,问最多可以到达多少个格子。由于n,m都是1e5级别,所以我们不能模拟。我们先观察一个结论,对于第i行,假设有y1,y2两个雷,[y1+1,y2-1]这个区间格子如何能被到达呢?只能从上面下来,所以我们在第i-1行中找打[y1+1,y2-1]这个区间内最左端的可到达的位置idx,那么第i行的[idx,y2-1]这个区间都是可到达的了。如果我们用1代表可到达,0代表不可到达,上面的操作实质原创 2021-11-06 17:25:01 · 458 阅读 · 0 评论 -
Codeforces Round #200 D. Water Tree(树剖+线段树 / 线段树+思维)
传送门给定有根树,初始点权为0,有三种操作:1、u为根的子树全部节点赋值为12、u到根节点1的路径上,所有的点赋值为03、查询u的点权带点权的树上路径修改问题,可直接树剖暴力写完。同时,树剖还可以解决这个问题的拓展:点权并非只有1,0两种,可以是任意值,同样是区间修改+区间查询。时间复杂度O(N logN log N)#include<bits/stdc++.h>using namespace std;//#pragma GCC optimize(2)#define ul原创 2021-11-05 15:56:46 · 153 阅读 · 0 评论 -
Codeforces Round #312 E. A Simple Task (桶排序思想+线段树维护桶)
传送门给定一个只包含小写字母的字符串,长度为n,m次操作,每次指定 [L,R] K K=0,让[L,R]区间降序排列,否则升序排列。输出最终字符串。由于每个数都相当于是[0,25]区间内,我们试试能不能开26个桶,第i个桶记录有多少个i,利用桶排序来求解。我们开n个桶,每个桶大小都是26,记录第i位的26个数分布情况。线段树维护桶序列,每个节点表示:当前区间内,桶合并后的情况,即:【0,25】这些数各有多少个。于是每次操作就可以这样处理:先区间查询出当前询问区间[L,R]里面,【0,25原创 2021-11-04 19:38:34 · 157 阅读 · 0 评论 -
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(利用二进制处理回文串+dsu on tree)
传送门每条边是一个字母,且最多22种,我们可以转化成一个二进制数,那么一条简单路径如果能重排得到回文串就等价为边权异或结果为2的幂数。(二进制下最多含有1个1)带边权路径问题,我们除了点分治之外可以枚举LCA,然后在LCA的子树中求解,再利用dsu on tree优化时间复杂度。最终把问题转化成:dis[i]表示根节点(1)到节点i的路径上边的异或结果,dep[i]表示i的深度,求满足dis[i] XOR dis[j] ==(2的幂数)的情况下dep[i]+dep[j]-2*dep[LCA]的最大值原创 2021-10-13 21:11:21 · 463 阅读 · 0 评论 -
E. Equilibrium (思维+RMQ)
给定两个序列a,b,q次询问,每次询问一个区间[l,r]。定义平衡运算: 可以任意选择偶数个位置pos1…pos2k; a[pos1],a[pos3]…a[pos2k-1]加1,b[pos2]…b[pos2k]加1 ,询问至少需要多少次平衡运算,才能使得区间[l,r]的a b元素对应相等。如果无法相等,输出-1。每次询问都是独立的。构造数组c[i]=a[i]-b[i],a[i]+1相当于c[i]+1,b[i]+1相当于c[i]-1,于是这个运算就等价于,c[pos1]+1,c[pos2]-1...原创 2021-09-28 19:07:07 · 189 阅读 · 0 评论 -
C. Compressed Bracket Sequence (枚举+思维)
传送门给定了一个序列,奇数位表示左括号的个数,偶数位表示右括号的个数,问这串括号有多少个子串是合法的。如,[4,1,2,3,1]表示"(((( ) (( ))) (" 一共有5个子串是合法的。参考这位大佬的题解传送我们枚举奇数位i,再枚举i之后的数,去计算i作为区间左端点的贡献。贡献分两类:①i的左括号和后面右括号匹配产生贡献②i位置开始的合法序列与后面的合法序列合并产生贡献对于①类贡献,我们在向后遍历的过程中,有可能会有新的左括号剩余,当我们遍历到多余的右括号时,如果过程中没有左括号剩原创 2021-09-27 20:40:03 · 242 阅读 · 0 评论 -
K - Kangaroo Puzzle Gym - 101981K (随机+乱搞)
传送门在一个最大为20*20的网格上,有出了若干只袋鼠,可以控制所有的袋鼠同时向上下左右某个方向走一格,袋鼠可以在一个格子重合,输出一个不超过5e4的UDLR序列,使得所有的袋鼠最终走到同一个格子。由于格子最多就400个,我们是控制所有袋鼠向同一个方向走,并且两只袋鼠走到同一格就可以看成合并了,所以走5e4步之后所有袋鼠合并的概率应该是特别大的,所以随机走5e4即可。#include<bits/stdc++.h>using namespace std;//#pragma GCC opt原创 2021-09-12 21:45:27 · 642 阅读 · 1 评论 -
Codeforces Round #735 (Div. 2) (A+B+C+D)
4个都是思维题[A. Cherry](https://codeforces.com/contest/1554/problem/A)[C. Mikasa](https://codeforces.com/contest/1554/problem/C)[D. Diane](https://codeforces.com/contest/1554/problem/D)[B. Cobb](https://codeforces.com/contest/1554/problem/B)A. Cherry题意:给定一个2e原创 2021-08-01 21:18:15 · 196 阅读 · 0 评论 -
C. Diluc and Kaeya (gcd+思维)
传送门题意:给定一个由D 、 K构成的字符串,对于其每个前缀,求出其最多能被分成多少个子段,满足每个子段的D K数量之比相同。(1<=n<=5e5)我们可以推出一个结论:对于某个DK串,假设有x个D,y个K,我们用map记录其每个前缀的D:K的最简比值,最终这个串的答案就是x:y最简比的个数。比如对于串DKDKDDDDK,我们把每个前缀都记录以下,最终2:1的个数有3个。那么它就可以被分成3段,满足每段的DK比最简形式都是2:1 。 (很明显,我们先把第一个满足2:1的前缀分割下来,剩原创 2021-06-07 17:04:05 · 635 阅读 · 0 评论 -
CF1528D(n² dij+增边优化建图)
传送门题意:给定有向图,n个点,m条边。第i条边在0时刻由a[i]->b[i]代价c[i] 。每过t时刻,第i条边变成由a[i]->(b[i]+t)%n ,代价仍是c[i] 。对于每个出发点0~n-1,求出到其余点的最短路。(2<=n<=600,n<=m<=n²)分析:首先肯定是考虑跑dijkstra,这题的边数会达到n²,堆优化的dij时间的mlogn,所以得用普通版本的dij,时间复杂度是O(n²)。每个点在松弛过程中,由于我们可以在某个点停留,所以需要原创 2021-05-26 20:27:28 · 235 阅读 · 0 评论 -
E.Trees of Tranquillity(dfs序)
传送门题意:给定了两棵有根树,都是以1为根。标号为树1,树2 。我们现有n个独立的点,要进行连边操作,u,v可以连边当且仅当他们在树1中有祖孙关系,在树2中无祖孙关系 。连完边后,问得到的这个图的最大团的顶点数是多少。团(clique):任意两个顶点都有直接边的子图。分析:首先我们通过dfs序把祖孙关系转化一下:L[i]表示进入i的dfs序,R[i]表示从i子树出去时候的dfs序, 那么一个节点就对应了一个区间 [L[i],R[i]] , u v有祖孙关系就等价于区间有包含关系,无祖孙关系原创 2021-05-26 15:38:44 · 618 阅读 · 3 评论 -
P6492 [COCI2010-2011#6] STEP (线段树)
题目链接我们先规定L为0 R为1,题目就是求最长的01/10串从题意来看,类似单点修改 区间查询,于是思考能否用线段树来维护某些东西,从而在logn时间内完成查询。我们令tree[rt].ans 表示rt对应区间的答案,也就是最长的01/10串我们考虑左右两个子区间 [l,mid] 、[mid+1,r] 的合并的若干种情况:①当左子区间右端点等于右子区间左端点 :此时根节点答案只能是左右子树答案中的最大值。tree[rt].ans=max( tree[lc(rt)].ans , tree[原创 2021-02-17 14:06:26 · 372 阅读 · 0 评论 -
Codeforces Round #717 (Div. 2) C. Baby Ehab Partitions Again (01背包+思维)
传送门题意:定义good array:数列无法被分成2个子序列,使得二者的元素和相等。给定数列,问最少删去多少个元素才能使其变成good array。(1<=n<=100,1<=a[i]<=2000)分析:首先如何判断一个数列是否是好数列? 从数据范围来看,我们可以用01背包。dp[i][j]:对于前i个数,选某些相加能否得到jdp[i][j]=dp[i-1][j] | dp[i-1][j-a[i]](可以优化掉一维)设sum为数列所有元素之和,dp过程原创 2021-05-17 20:18:11 · 160 阅读 · 0 评论 -
P2568 GCD (欧拉函数+gcd)
传送门1<=n<=1e7首先考虑gcd(x,y)==1的对数,很容易想到答案就是Σphi[i],对欧拉函数求前缀和就行。但是题目要求是gcd(x,y)==p (p为素数),其等价为gcd(a*p,b*p)==p,(a b互质)于是我们可以令x==a*p,y=b*p,那么对于每个p 都只需要求出满足1<=a*p,b*p<=n,gcd(a,b)==1的a,b对数即可,这个就转化成了我们起初考虑的问题。具体做法就枚举素数j,Σpre[n/j] ,又因为a b/ b a 是不同原创 2021-05-13 16:36:10 · 563 阅读 · 0 评论 -
Codeforces Round #719 (Div. 3)G. To Go Or Not To Go?(bfs+思维)
题目链接题意:给定n*m的地图 ,大于0的数字格子可以互相传送 ,代价是传送起点+传送终点格子上的数字和,-1的格子不能走,保证(1,1)和(n,m)不为-1 。问(1,1)到(n,m)的最小代价是多少?分析:虽然图上给了最多n²个传送门,但是考虑到x1,y1传送到x2,y2的代价为a[x1][y1]+a[x2][y2],也就是说如果我们要从A传送到B,那么直接A->B绝对比A->C->B要更优 。 所以我们要么就传送一次,要么就一次也不传送。我们分别从起点和终点进行bfs,每次记原创 2021-05-07 20:58:16 · 198 阅读 · 0 评论 -
Codeforces Round #577 (Div. 2) D. Treasure Hunting (贪心+dp)
题目链接题意:给定n*m的格子图 , 某些格子有宝藏 。出发点在最下角(1,1), 移动规则为:不可以向下走。只有位于某些特殊列的时候能往上走, 否则只能左右移动。数据范围是2e5 。分析:首先每一行的宝藏中,我们只需关心最左端和最右端的2个就行,取完这一行的宝藏后,停的位置要么是在最左端宝藏 记为L,要么是在最右端宝藏 记为R。要向上走的时候,L/R每种情况又有2种选择,记L右边最近的特殊列为Lr,左边最近的特殊列为Ll,停在L位置的时候,要么从Lr上去,要么从Ll上去,上去之后停的位置又有最左原创 2021-05-06 19:31:46 · 123 阅读 · 0 评论 -
2021-M-Stone Games(思维+主席树)
题目链接题意:给定了n堆石子每堆的数量是[1,1e9]的整数,q次询问,每次给出区间[l,r],可以选择[l,r]区间的石子堆加起来凑出一个数x,问最小的无法被凑出的数是多少?(每次询问中,每堆石子最多选择1次,此题强制在线)分析:对于[l,r]区间,我们把石子数放进一个桶里。首先0肯定可以被凑到,因为可以每堆都不选。此时我们关心1是否能被凑到,我们查询桶内 值在[0,1]区间的数的和,假设和为x,(也就是有x个1), 那么说明我们可以凑出[0,x]区间的所有数(当然,如果此时x的值是0,那原创 2021-05-06 15:23:10 · 173 阅读 · 0 评论 -
Codeforces Round #656 (Div. 3) G. Columns Swaps (并查集 + 2-SAT问题)
题目链接题意:给定一个2*n的矩阵,每个元素都是[1,n]的整数,现要选取某些列,使这些列的上下两行交换,得到的矩阵每行都是一个排列,问最少要选多少列。分析:对于每列,只有选和不选两种状态。如果两个相同的数位于同一行,那么所在的两列的状态必须相异(一个选 一个不选)如果位于不同行,那么所在的两列的状态必须相同(同时选或不选)也就是说,列的状态是具有传递性的,可以用(带权)并查集来维护传递性关系,当然,这题用虚点并查集的写法更简洁 , i表示选取,代价为1, i+n表示不选取,代价为0.实现原创 2021-04-29 10:56:59 · 209 阅读 · 0 评论 -
Codeforces Round #656 (Div. 3) F. Removing Leaves
题目链接题意:给定一棵无根树,一次操作只能删去k个有相同邻接点的叶子节点。问最多可以有多少次这样的操作。分析:这题不用想太复杂,对于一个连了>=k个叶子的节点来说,删去k个叶子,不会对其他的节点造成影响,所以满足局部最优,可以直接贪心选取。具体的做法是记录每个顶点的度,相邻的被删的叶子数。用一个队列存叶子节点,挨个删去,同时记录删去当前叶节点对周围节点产生的影响,如果当前删除使得某个节点相邻的被删的叶子成为了k的倍数,则答案+1。如果此时度变成了1,那么说明他成为了新的叶节点(即:该节点原创 2021-04-26 20:38:41 · 127 阅读 · 0 评论 -
Codeforces Round #656 (Div. 3)E. Directing Edges (有向图判环拓扑排序)
题目链接题意:给定有向图,但是部分边没有确定方向,现要求确定这些边的方向且完成后图不存在环。分析:对于DAG有一个性质就是,按tupo序的时间戳方向加入边的话,这个图仍是DAG。 所以这题我们先不考虑无向边的影响,进行一次tupo排序,如果此时就存在环了,那么一定是NO ,否则就是YES ,然后对于无向边我们定义成tupo序的方向即可。#include<bits/stdc++.h>using namespace std;#define ll long long#define pii原创 2021-04-26 16:54:00 · 132 阅读 · 0 评论 -
Codeforces Round #575 (Div. 3) E. Connected Component on a Chessboard (构造)
题目链接题意:在一个无限大的国际象棋棋盘中,左上角是白色格子,要求选定一个连通块,包含w个白色格子,b个黑色格子。(1<=w,b<=1e5)分析:不妨假设w>b ,那么w最大只能为3b+1。(因为只有第1个b可以接4个w,以后最多只能接3个w)。然后就模拟取格子的过程,先取(1,2)处的黑格子。然后循环 每次取 (x,2)处的白格子 + 右左下的三个黑格子。直至w==b退出循环。此时w和b相等,选上一行开始取即可。#include<bits/stdc++.h&g原创 2021-04-25 23:06:44 · 134 阅读 · 0 评论 -
Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) (思维+枚举+前缀和优化)
题目链接题意:给定由RGB三个字符组成的字符串s,问最少修改多少处,才能使得s存在一个长度为k的子串,满足其同时也是无限字符串"RGBRGBRGB…"的子串。(1<=|s|,k<=2e5)分析:在easy版本中我们枚举了每个长度为k的子串,每个子串也在RGB分别开头的三种情况中求出了要修改的位置数目。时间是O(NK)。我们可以用0表示和无限串相应位置的字符相等,1表示不等,那么可以通过前缀和在O(1)求出每个子串的答案。 时间是O(N)。#include<bits/stdc++原创 2021-04-25 23:00:47 · 107 阅读 · 0 评论 -
Codeforces Round #575 (Div. 3) C. Robot Breakout (思维)
题目链接题意:在一个区域范围无穷的二维坐标轴上,n个整数坐标点上放有机器人,理论上可以上下左右四个方向移动,但是对于每个机器人,有部分方向移动不了。问能否给出一个坐标, 使得所有机器人都能到达。(1<=n<=1e5,每个机器人坐标绝对值都在1e5之内)分析:建好坐标系后,对于每个机器人i : (xi,yi),可以通过移动方向限定可以走的范围。比如如果不能往下走,那么y方向的最小范围就限定在yi,如果不能向右走,那么x方向最大范围就是xi 。开四个变量记录目前的合法范围,对于每个机器原创 2021-04-25 22:52:37 · 199 阅读 · 0 评论 -
Codeforces Round #574 (Div. 2) E. OpenStreetMap (单调队列)
题目链接题意:给定了一个最大为30003000的矩形,问里面每个ab小矩形内的最小值之和。 (1<=a,b<=n,m)分析:先对每行用单调队列维护长度为b的区间的最小值,存进row[i][j]里面,row[i][j]表示第i行中,[j-b+1,j]区间内的最小值。再对row数组的第b,b+1…m列 每列都用单调队列维护长度为a的区间的最小值。这样得到的就是一个a*b的小矩形的最小值。#include<bits/stdc++.h>using namespace std;原创 2021-04-25 13:30:37 · 106 阅读 · 0 评论 -
Submarine in the Rybinsk Sea (hard edition) CodeForces - 1195D2 (思维)
题目链接题意:定义函数f(x,y):要计算分析:枚举是n²的复杂度,所以肯定和easy版本一样可以找到规律。我们随便拿两个数来模拟一下,比如123 、 45 ,考虑f(123,45) + f(45,123)= 12435 + 142531在10^(5-1)位作了两次贡献,2、4在10^(4-1) 10 ^(3-1)位分别作了一次贡献,1、5在10^(2-1) 10 ^(1-1)位分别作了一次贡献,所以规律就是:对于两个长度分别为len1,len2的数(len1>=len2)原创 2021-04-23 23:31:03 · 147 阅读 · 0 评论 -
One Occurrence CodeForces - 1000F (思维+主席树)
题目链接题意:给定序列a ,q次询问 每次询问要求[l,r]区间任意一个只出现过一次的数 没有则输出0 。分析:这题和这题十分类似,我们先分析对于右端点固定的区间,求出[1,r]内任意的[l,r]区间只出现过一次的数。我们用last[i]维护i上一次出现的位置,那么对于序列last[a[i]](i映射成last[a[i]]),我们查询[l,r]内是否存在只出现过一次的数就等价于last[a[i]]在[l,r]区间是否存在小于l的值, 根据贪心我们可以用线段树维护序列last[a[i]]的区间最小原创 2021-03-15 10:19:49 · 247 阅读 · 0 评论 -
What Is It? CodeForces - 1474E (逆向思维+构造)
目录题目链接一、pandas是什么?二、使用步骤1.引入库2.读入数据总结题目链接一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnin.原创 2021-03-29 23:55:02 · 190 阅读 · 0 评论 -
Sum of Paths CodeForces - 1467D (线性dp)
题目链接题意:在一段数列上,机器人可以选任意初始点,移动k格 。定义一条路径由机器人移动的k+1位置组成,c0,c1…ck。路径的值为a[c0]+a[c1]…+a[ck] 。q次单点修改,每次改完后 ,求所有路径的值之和。分析:先不关心单点修改。每个点的最终贡献就是其被经过的次数*点值。我们只要在O(N²)时间内把每个点被经过的次数求出来就能解决这题。令dp[i][j]为走i步到达j点的方案数,同时由于路径可逆,它还表示从j点出发走i步能产生的路径数。 (两种含义综合一下i就可以作为中间点原创 2021-03-27 16:30:19 · 126 阅读 · 0 评论 -
Three Bags CodeForces - 1467C (贪心)
题目链接题意:给定三个背包,各自装有n1 n2 n3个数,每次操作从任意两个背包A B分别选出任意一个数a b,然后丢掉b ,把a替换成a-b 。 问重复操作下去最后剩下的数最大可以是多少。(1<=n<=3e5)分析:我们用A B C表示3个背包,min(B)<min(A) 且 min(C)<min(A)假设最终的数是在A中。一个数从初始背包转移出去,当且仅当它转移次数为偶数的时候才能对答案有正贡献。比如B中的某个数b[i],要产生正贡献比如和C中某个数结合,然后转移进A原创 2021-03-27 12:37:31 · 167 阅读 · 0 评论 -
https://vjudge.net/problem/CodeForces-1472E (贪心)
题目链接题意:给定一组(w,h),问对于每个元素i,能否找到一个元素j使得a[j].w ,a[j].h分别小于a[i].w, a[i].h 或者 a[i].h, a[i].w 。分析:我们令w为较小值,h为较大值,然后按w升序排序。先贪心地选择第1个数作为候选的答案,令id=1如果a[i].h>a[id].h 那么i的答案就是a[id]的排序前下标否则 , 我们根据贪心必须把id=i理由:①当i+1的w等于i的w,那么i+1的h必顶小于i的h,也必定不大于id的h,所以把id=i无影响原创 2021-03-25 20:09:20 · 226 阅读 · 0 评论 -
F - New Year‘s Puzzle CodeForces - 1472F (思维)
题目链接题意:给定一个2n的矩形,有m个格子被涂黑了,问在不覆盖黑格子的情况下其余的格子能否被12的小矩形填满。思路:我们首先可以知道如果m是奇数,那么肯定是不可以填满的,无论如何都会有一个缺口。m为偶数的时候,我们先分析2个相邻的黑点。当黑点在同一行:当且仅当两个黑点之间相差偶数个格子的时候才是有解的,否则无论怎么放都会有空缺。当黑点在不同行:只有两者列数之差为偶数才可以满足条件。所以做法就是先把黑点排序,然后两两判断就好。(黑点1和2 3和4 … 这里2和3之间是不用判断的原创 2021-03-25 19:41:37 · 142 阅读 · 0 评论 -
Glass Half Spilled CodeForces - 1459D (思维+二维费用01背包)
题目链接题意:给定n个杯子,第i个容量为a[i],暂时装有b[i]的水, 允许把某个杯子的水倒入另一个杯子,但是倒的过程会损失一半,且被倒入杯子的水的上限不超过其容量。 现在只能用k个杯子装水,问最多能得到多少水。(k∈[1,n])(1<=n<=100,0<a[i]<=100)分析:我们假设所有杯子总水量为S, 选出的k个杯子容量为v, 原有的水量之和为A, 那么把其他的水倒进这k个杯子 ,最终答案ans=min(v , A+(S-A)/2) (其他杯子的水无论怎么倒原创 2021-03-24 13:40:55 · 244 阅读 · 0 评论 -
The Treasure of The Segments CodeForces - 1462F (思维)
题目链接题意:在坐标轴上给定n个线段,用li,ri表示左右端点,问最少删去多少个线段,才能使得剩余线段中,存在一个线段与其余线段都有交集。分析:题目可以等价为对于每个线段求出和它没有交集的线段个数,然后取最小值就是答案。那么对于某个线段如何求与他没有交集的线段个数呢?线段A与线段B没有交集等价为 A的右端点在B的左端点左边,或者 A的左端点在B的右端点的右边所以我们可以把左/右端点拿出来存进2个数组里面排好序,枚举每个线段再利用二分查找就可以解决了。#include<bits/stdc原创 2021-03-20 23:55:45 · 219 阅读 · 1 评论 -
Close Tuples (hard version) CodeForces - 1462E2 (杨辉三角求组合数)
题目链接题意:给定序列,给定正整数k m,问有多少个子序列满足分析:升序排序,枚举每个位置相当于是子序列中最小的那个元素,然后二分查找第一个大于a[i]+k的位置index, 接下来就相当于在区间 [i+1,index-1] 中任意找出m-1个元素就好 ,也就是求个组合数,可以先打好表。#include<bits/stdc++.h>using namespace std;#define ll long long#define pii pair<int,int>con原创 2021-03-20 17:38:15 · 98 阅读 · 0 评论 -
CF1004F Sonya and Bitwise OR (线段树+暴力区间合并)
题目链接题意 :给定序列a , q次操作,包括单点修改和区间询问, 每次询问一个区间[l,r]内 ,有对少对[L,R]满足a[L,R]所有数的按位或运算结果不小于给定的x 。分析:序列a的每个数都小于2^20。那么每个区间的前缀(以及后缀) 扫过去进行或运算,显然这个过程中结果会不断增大,但是结果变化不会超过20次。 所以我们可以用一个vector记录前缀(以及后缀)扫描过程中或运算的结果以及个数 。(显然vector中的元素大小是递增的)所以我们用线段树维护三个信息,区间答案、前缀或运算情况、后原创 2021-03-17 23:12:18 · 219 阅读 · 0 评论