首页 > 其他分享 >Solution Set - 贪心和数据结构

Solution Set - 贪心和数据结构

时间:2023-09-13 14:55:05浏览次数:40  
标签:Set 端点 Submission 路径 Solution 最小 Link 位置 贪心

感觉自己好菜啊,这个专题真的不太会。

CF1439C Greedy Shopping

Link&Submission.

容易发现,当此人连续买了一段物品之后,他的钱数至少减半。所以他最多只会买 \(O(\log V)\) 段物品。那么就可以直接模拟每次询问,不断往后轮流找最多能买到的位置和下一个能买的位置。二者都可以线段树上二分,维护前缀和最大值和区间最大值。修改也是容易的。时间复杂度 \(O(n\log^2n)\)。

CF436E Cardboard Box

Link&Submission.

考虑贪心,每次取当前能够取的代价最小的星。然而这肯定不对,所以打一个补丁:如果某个两星代价比最小的两个一星之和小,那么就先把它玩到一星。注意如果只差一颗星了是不采用这个策略的。正确性还是比较显然的。

CF1452G Game On Tree

Link&Submission.

先做一次多源BFS,求出Bob占领每个点的最小时间 \(t_i\)。如果点 \(u,v\) 满足 \(dist(u,v)\le t_v\),那么Alice从 \(u\) 开始可以先于Bob到达 \(v\),这样就可以用 \(t_v\) 更新 \(u\) 为起点的答案。考虑点分树,记下每棵子树内的所有点及距离并排序,然后从每个点开始跳父亲,能更新的是一段前缀。直接二分即可。时空复杂度都是 \(O(n\log^2n)\)。

CF625E Frog Fights

Link&Submission.

模拟,用一个链表维护所有青蛙。把发生“撞飞”的时间记在一个堆里,不断取堆顶模拟,更新链表和堆。

一个实现时的细节是,当一只青蛙撞飞另一只青蛙后,直接把它的初始位置往右移动经过的时间即可。

CF533A Berland Miners

Link&Submission.

根到每个点的路径上有一个瓶颈,就是这条路径上的最小点。对每个点开一个vector,记下以它为瓶颈的所有路径。假设选择 \(u\) 增加一些,那么会导致一些路径的最小高度增加,这些路径一定都以 \(u\) 为瓶颈。一些路径仍然以 \(u\) 为瓶颈,其余的路径的最小高度会变成它的次小值。从小到大枚举 \(u\) 变成的高度,用权值线段树维护。具体来说,人的高度位置加上一个 \(-1\),路径的高度位置加上一个 \(1\),则后缀和始终非负时有方案。如果 \(u\) 变成某个高度时有方案了,那么上一个高度最后一个后缀和为负的位置就是 \(u\) 需要变成的最小高度。

CF1427F Boring Card Game

Link&Submission.

首先不考虑轮流操作的限制,容易用栈模拟出一种方案:从左往右向栈里加数,如果栈顶的三个数属于同一个人就弹出栈顶。这样的方案肯定是存在的,因为保证了有解。

对于一组数 \(a\lt b\lt c\),考虑完全包含在区间 \([a,c]\) 内的数组。在直接包含的数组间连边,得到一个森林。要求必须先取儿子再取父亲。显然有边相邻的两组数不会属于同一个人,那么轮流剥叶子就可以了。

CF671E Organizing a Race

Link&Submission.

先考虑固定一个区间如何最小化增加量。从左往右扫,当某一段路开不过去的时候就给上一个点加油。也就是说每次都选择尽可能右边的点加油。最后如果还有剩的,全部留给右端点就行。

考虑用前缀和刻画,会发现选择加油的点可以用单调栈维护。那么从右往左扫描,维护单调栈,就可以用线段树维护出后缀和进行判断。固定左端点,假设已经通过加油使得左端点可以一直向右。先二分出一个最远的位置,使得到达它需要增加的量不超过 \(k\)。然后会发现一个事情:如果一个区间内有解,那么初始最大值最大的位置一定是解。 事实上我们要求的是右端点的后缀和最大,而右端点加了 \(k\),前面的点加的都不超过 \(k\),所以上面这个结论成立。直接在线段树上二分即可。

以上用自然语言描述了算法的框架,进行列式会更好理解。

CF1548E Gregor and the Two Painters

Link&Submission.

我们在连通块内权值最小的位置统计答案。 一个点能够成为连通块内最小的点的条件是:首先它得是黑点,其次它不能只经过黑点到达一个权值比它小的点。如果权值相同,把横坐标作为第二关键字,纵坐标作为第三关键字。

会发现要进行这个判断,只要考虑单独往一个方向的情况。要求往上下左右都不能到达更小的位置。具体来说,假设考虑的点是 \((i,j)\),\(a_i\) 左边不大于他的第一个点是 \(lsta_i\),右边小于它的第一个点是 \(nxta_i\),则要求 \((i,j)\) 不能到达 \((lsta_i,j),(nxta_i,j)\),再加上对 \(b\) 类似的限制即可。

要“到不了”,就要求路径中间有一些不是黑点。记 \(ma_i=\min(\max_{j=lsta_i}^ia_j,max_{j=i}^{nxta_i}a_j\),对 \(b\) 类似定义 \(mb_i\)。要求 \(a_i+b_j\le x,a_i+mb_j\gt x,ma_i+b_j\gt x\)。离线二维数点解决。

标签:Set,端点,Submission,路径,Solution,最小,Link,位置,贪心
From: https://www.cnblogs.com/by-chance/p/17699708.html

相关文章

  • Bug库____org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorr
    Bug:使用到了spring的jdbctemplate模板使用到以下template.queryForObject(sql,requiredType)template.queryForList(sql,elementType,args)报以下错误org.springframework.jdbc.IncorrectResultSetColumnCountException:Incorrectcolumncount:expected1,actual3检查完......
  • reset | revert 使用场景:
    reset|revert使用场景:gitreset[commitId]||备注:此id对应修改会保留;reset后修改保留至本地,处于modified状态,若不提交,则服务器提交记录依然存在,若提交,可以将reset后的结果推送到服务器gitreset--hard[commitId]||备注:reset后本地所有修改均回退(注意是所有修......
  • BUG(Spring Framework JdbcTemplate) org.springframework.jdbc.IncorrectResultSetCo
    一.SpringFramework queryForObject问题1.spring4.0之前使用使用jdbctemplate的queryForObject(Stringsql,Object[]args,RowMapper<T>rowMapper)直接放入class类型会报错org.springframework.jdbc.IncorrectResultSetColumnCountException:Incorrectcolumncount:expec......
  • Vue.set和splice方法有什么区别?
    Vue.set方法和splice方法在Vue中用于修改数组的行为有一些区别。一:Vue.set(obj,key,value):用途:Vue.set是Vue提供的全局方法,用于向响应式对象中添加新的响应式属性,并确保这个新属性是响应式的。参数:obj:要修改的目标对象。key:要添加的属性键名。value:要添加的属性值。示......
  • 详解Paint的setXfermode(Xfermode xfermode)
    一、setXfermode(Xfermodexfermode)Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是图像混合的一种,这个方法跟我们上面讲到的setColorFilter蛮相似的。查看API文档发现其果然有三个子类:AvoidXfermode......
  • setInterval和setTimeout的区别
    在制作网页动态效果时,一定会遇到某些需求,要求某段程序等待多时时间后再开始执行,就像在我们的生活中一样,待会儿再开始做一件事。在JavaScript中主要通过定时器实现此类需求,本文将对定时器做一个概括,正对setTimeout()做一个详细用法总结。一.setInterval与setTimeout的区别setInterva......
  • c语言之memset的初次小练
    //memset--memoryset内存设置//memset(void*ptr,intvalue,size_tnum);//翻译过来就是memset(一个地址,一个你想要将地址中的原有值改为该值,该地址中从左往右的原有的值的数)#include<stdio.h>#include<string.h>intmain(){ chararr[]="helloworld"; memset(arr,......
  • vue可以使用this.$set()来进行强制更新,进而解决问题
    可以使用this.$set()来进行强制更新,进而解决问题对象操作:三个参数:this.$set("改变的对象","改变的对象属性","值")数组操作: 三个参数:this.$set("数组","下标","值")......
  • ValueError: Per-Channel support with QDQ format requires onnx opset version 13 o
    问题:在做静态量化是,遇见onnxopsetversion版本报错解决办法:withtempfile.NamedTemporaryFile()asfp:torch.onnx.export(model,args=tuple(dummy_input.values()),f=output_model_name,input_name......
  • 多模块项目依赖中,项目启动失败-org.yaml.snakeyaml.error.YAMLException: java.nio.ch
    异常问题专栏收录该内容22篇文章1订阅订阅专栏错误:org.yaml.snakeyaml.error.YAMLException:java.nio.charset.MalformedInputException:Inputlength=1原因:yaml/yml配置文件解析失败解决:把项目编码(FileEncodings)全部设置为UTF-8,后重启IDEA软件;其中,若为多模块项目依......