CF div3 995 (A~G)
期末周之第三把网瘾(真是越来越放肆了...)。这次赛时了一把div 3 , 又一次只做出了A~E,写完E后剩下的题没时间看了(受了些寝室噪音的干扰,最后二十分钟才出)。赛后看了下F和G,感觉也是一时半会儿做不出来的题,遂来补题。
ABCD
这次前四题都很白给。ABC纯模拟题,D是枚举左端点二分右端点的典套路。
不过BC的总共5发罚时确实有点说不过去了,这个和当时寝室比较吵,注意力不集中的关系比较大。以后在寝室打CF时应该提高一下专注力了。
E
用了树状数组 + 离散化过的。感觉这道题挺不错的,需要一点点的思维和代码实现能力。
题意就是给定\(n\)个区间\([a_i,b_i]\) ,然后有一个单价\(w\)。对于某个区间,当\(b_i>=w\)时,这个区间会被选,否则不会选;同时当\(w\)\(<\)\(a_i\)时,这个区间会收到一个差评(在题目中区间是一个商品。这里为了简化题意,就直接这样陈述了)。让你钦定一个\(w\),使得最后获得的总价值最大,并且差评数不超过定值\(k\)。
首先有一个很关键的性质:钦定的单价\(w\)一定是题中给定的某一个\(a_i\)或\(b_i\)。证明很简单:将所有\(a_i\)和\(b_i\)放在一起排个序。反证一下,如果\(w\)不是其中的某个数,则:
- 当这个数不超过其中的最大值时,一定可以把他扩大到比它大的且最接近于它的数。这样差评数和购买商品的数量都不会发生变化,合法性仍然保持的同时单价提高了,答案也会变得更优。
- 当这个数超过了其中的最大值时,显然没有商品会被购买,总价值为\(0\)。
故可以\(O(n)\)枚举单价\(w\),答案一定在这些情况中的某一个。枚举时计算出当前情况下 购买的商品数 以及 收到的差评数 即可。
我赛时的思路是分别枚举\(a_i\)和\(b_i\),两种枚举分别用不同的方式来判断。
枚举\(b_i\)的判断方式:
将所有区间根据\(b_i\)降序排序,这样在枚举时(设当前枚举到的区间为\([a_i,b_i]\),\(w\)为当前枚举区间的\(b_i\)),所有买的物品一定是当前枚举物品的前缀,不买的物品一定是后缀。维护当前的前缀中所有\(<w\)的\(a_i\)的数量,这相当于带修的查找\(<k\)的所有数的数量,很明显是树状数组可以完成的事情。所以先将所有\(a_i\)离散化,并在枚举的过程中修改并查询即可。
枚举\(a_i\)的判断方式:
和上面的比较类似。将所有区间根据\(a_i\)升序排序,这样在枚举时(设当前枚举到的区间为\([a_i,b_i]\),\(w\)为当前枚举区间的\(a_i\)),后缀的区间都可以被购买且不会收到差评(\(a_i<b_i\));而前缀中,只要被购买的区间就一定会收到差评,但不是所有区间都会被购买。这样,就只需要在枚举\(a_i\)的过程中,维护前缀中所有\(<w\)的\(b_i\)的数量,这些区间都不会被购买。这样,剩下的\(i-1-notbuy\)个区间都会被购买且受到差评。结合后缀信息,总的差评数和购买数就均已知了。
总复杂度\(O(nlogn)\),常数应该比较大,但肯定可以过去。
F
模拟 + 分类讨论,赛后看b站讲解后过的。
直接 在脑海中构想 \(or\) 画图,容易发现Joker出现的位置会形成若干段连续的区间。具体来说:
- 当移动的牌不是Joker可能出现的位置时,Joker出现的位置一定是中间的一段连续区间。
- 第一次移动可能是Joker的牌时,牌的前缀与后缀会出现Joker。
- Joker出现的位置最多只会形成前缀,中间,后缀三段区间,证明不再赘述。
所以只需要维护三段区间的左右端点即可。前缀和后缀可以分别用\(above\)和\(below\)单独的指针来维护,中间的区间用\(Lmid\),\(Rmid\)两个指针来维护。模拟所有移动的情况,维护这四个指针的位置即可。注意区间相交时要把区间合并起来。
同时有一个坑点:第一次移动Joker时,若中间区间的长度为1,即只有一个Joker时,中间的区间会消失,即只会形成前缀和后缀两段区间,这个需要专门特判一下。当时自己在想这道题时除了这个坑点,其他的都没问题。还是得再细心一些。。。
G
状压\(dp\)。听完题解给的状态定义后,自己把 状态转移 和 预处理转移数组的方法 补出来了,也算是补得比较成功。
\(n <= 20\),毫不犹豫直接状压。
状态定义:\(dp[state][i]\)表示地图中只有二进制数\(state\)表示的全部蛇,并且最后一只蛇的编号为 \(i\) 时,在满足题述移动方式合法性的前提下,最右侧位置最近的格子是第几个。
状态转移:
dp[state|(1<<j)][j + 1] = min(dp[state|(1<<j)][j + 1] , dp[state][i + 1] + g[i + 1][j + 1]);
其中编号为 \(i\) 的蛇在已知序列中的最后一个,编号为 \(j\) 的蛇要加入到当前末尾后面的位置。
\(g[i][j]\)表示当 编号为 \(i\) 的蛇 和 编号为 \(j\) 的蛇 紧邻时,为了保证所有移动操作的合法性,二者需要间隔的最短距离。这个需要根据题目给定的移动序列预处理出来。
预处理\(g[i][j]\)的方法:
首先每只蛇在未经移动操作时至少间隔1个格,故初始化为1。
之后的 \(+\) \(-\) 号处理类似于栈的操作:所有的减号可以抵消掉它后面和它相关的加号。具体解释可能比较麻烦,可以看代码和注释来感性理解一下,还是比较好懂的。
哦对了,最后的答案应当取下式的最小值,而不只是\(dp\)数组的最小值:
dp[(1<<n)-1][i] + move_front[i] , 1 <= i <= n
其中\(movefront[i]\)表示第 \(i\) 条蛇向右移动的距离,即移动操作 \(i +\) 出现的次数。
CF div3 995 (A~G)的更多相关文章
- js如何使用正则表达式实现过滤HTML标签?(/<[^<>]+>/g)
js如何使用正则表达式实现过滤HTML标签?(/<[^<>]+>/g) 一.总结 js进阶正则表达式实现过滤HTML标签(<>标签中不能包含标签实现过滤HTML标签 ...
- 12.27 cf div3 解题报告
12.27 cf div3 解题报告 wxy.wxy,带上分拉,全场做了个无脑小白 比赛场地 A: T1,跟着模拟就好了 B: sort一遍之后 去除的数一定是a[1]或者a[n] 比较去除谁小就输出 ...
- js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g)
js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g) 一.总结 方括号:范围 圆括号:选 大括号:数量 1.js正则是在双正斜杠之中: var reg2=/[a-z]/ ...
- js进阶正则表达式9量词2(^和&作用:/^HTML5$/g匹配不到aHTML5b中的HTML5,不然是可以匹配到的)(/\d+(?=cm)/g)((?!cm))
js进阶正则表达式9量词2(^和&作用:/^HTML5$/g匹配不到aHTML5b中的HTML5,不然是可以匹配到的)(/\d+(?=cm)/g)((?!cm)) 一.总结 ^和&作用 ...
- js进阶正则表达式7点数字字母空格(w d s)(小写表原意,大写表反义)(特殊字符要加反斜杠:var reg22=/\W/g)
js进阶正则表达式7点数字字母空格(w d s)(小写表原意,大写表反义)(特殊字符要加反斜杠:var reg22=/\W/g) 一.总结 1.w d s,word digital space 2.特 ...
- CF(协同过滤算法)
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- CF 363B One Bomb(枚举)
题目链接: 传送门 One Bomb time limit per test:1 second memory limit per test:256 megabytes Description ...
- C++之路进阶——codevs2933(诗人小G)
2933 诗人小G 2009年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 小G是一个出色的诗人 ...
- 在Windows/Ubuntu下安装OpenGL环境(GLUT/freeglut)与跨平台编译(mingw/g++)
GLUT/freeglut 是什么? OpenGL 和它们有什么关系? OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用.如果需要在程序里直接使用OpenGL, ...
- Asp.Net Mvc: 浅析TempData机制(转发 作者: Tristan G )
Asp.Net Mvc: 浅析TempData机制 环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0 --------------------------- ...
随机推荐
- .NET周刊【10月第3期 2024-10-20】
国内文章 我被 .NET8 JIT 的一个BUG反复折磨了半年之久(JIT tier1 finally optimizations) https://www.cnblogs.com/calvinK/p ...
- Chrome 130 版本新特性& Chrome 130 版本发行说明
Chrome 130 版本新特性& Chrome 130 版本发行说明 一.Chrome 130 版本浏览器更新 1. 新的桌面提示 Chrome 130 引入了一种新的 Toast 样式,用 ...
- String,StringBuffer、StringBuilder的区别
1.可变性 String:是不可变的.其内部是fianl修饰的,每次变更都会创建一个新的对象. StringBuffer.StringBuilder是可变的,字符串的变更是不会创建新对象的. 2.线程 ...
- JDBC中数据库的连接与查询
让我们仔细看看是怎么访问数据库的 package sql; import java.sql.Connection; import java.sql.DriverManager; import java ...
- 780E开发板之errDump错误日志上报,操作方法解析
一.errDump功能 LuatOS-Air错误日志上报功能模块名叫:errDump,errDump对"量产投放市场的设备,远程调试初步定位问题"至关重要,强烈建议客户一定要使 ...
- [昌哥IT课堂]|欢迎 MySQL 9.0,回顾 Oracle 在 8.0 版中的管理(译)
对于新兴技术和社区的管理是相对容易的.经过 29 年发展,MySQL 已成为全球数百万用户中使用最广泛且备受信任的开源数据库之一.在这一规模的社区领导中可能存在复杂性.我们努力寻求稳定和创新的平衡,为 ...
- JAXP(Java API for XML Parsing)
JAXP(Java API for XML Parsing) 过去几年中,XML分折已经被标准为两个不同的处理模型:SAX(Simple API for XML)以及DOM(Document O ...
- 时序数据库之InfluxDB
涉及用户认证: shangmayuan.com/a/1056241c80ef4dfc9cef830d.html
- 解决GitHub无法访问问题
作为开发者,经常使用借助GitHub进行开发,但是最近一直无法访问github.com站点,决定搞一下!!! 由于国内某些原因,导致我们有时候不能访问到 www.github.com.此时我们必须找到 ...
- Python 学习记录(2)
NumPy数组规整 对数组进行各种变化 转换数组形状 import numpy as np a=np.arange(1,6+1) b=np.reshape(a,(2,3)) print(a) prin ...