期末周之第三把网瘾(真是越来越放肆了...)。这次赛时了一把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\)不是其中的某个数,则:

  1. 当这个数不超过其中的最大值时,一定可以把他扩大到比它大的且最接近于它的数。这样差评数和购买商品的数量都不会发生变化,合法性仍然保持的同时单价提高了,答案也会变得更优。
  2. 当这个数超过了其中的最大值时,显然没有商品会被购买,总价值为\(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)\),常数应该比较大,但肯定可以过去。

code

F

模拟 + 分类讨论,赛后看b站讲解后过的。

直接 在脑海中构想 \(or\) 画图,容易发现Joker出现的位置会形成若干段连续的区间。具体来说:

  1. 当移动的牌不是Joker可能出现的位置时,Joker出现的位置一定是中间的一段连续区间。
  2. 第一次移动可能是Joker的牌时,牌的前缀与后缀会出现Joker。
  3. Joker出现的位置最多只会形成前缀,中间,后缀三段区间,证明不再赘述。

所以只需要维护三段区间的左右端点即可。前缀和后缀可以分别用\(above\)和\(below\)单独的指针来维护,中间的区间用\(Lmid\),\(Rmid\)两个指针来维护。模拟所有移动的情况,维护这四个指针的位置即可。注意区间相交时要把区间合并起来。

同时有一个坑点:第一次移动Joker时,若中间区间的长度为1,即只有一个Joker时,中间的区间会消失,即只会形成前缀和后缀两段区间,这个需要专门特判一下。当时自己在想这道题时除了这个坑点,其他的都没问题。还是得再细心一些。。。

code

G

状压\(dp\)。听完题解给的状态定义后,自己把 状态转移 和 预处理转移数组的方法 补出来了,也算是补得比较成功。

\(n <= 20\),毫不犹豫直接状压。

状态定义:\(dp[state][i]\)表示地图中只有二进制数\(state\)表示的全部蛇,并且最后一只蛇的编号为 \(i\) 时,在满足题述移动方式合法性的前提下,最右侧位置最近的格子是第几个。

状态转移:

  1. 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\)数组的最小值:

  1. dp[(1<<n)-1][i] + move_front[i] , 1 <= i <= n

其中\(movefront[i]\)表示第 \(i\) 条蛇向右移动的距离,即移动操作 \(i +\) 出现的次数。

code

CF div3 995 (A~G)的更多相关文章

  1. js如何使用正则表达式实现过滤HTML标签?(/<[^<>]+>/g)

    js如何使用正则表达式实现过滤HTML标签?(/<[^<>]+>/g) 一.总结 js进阶正则表达式实现过滤HTML标签(<>标签中不能包含标签实现过滤HTML标签 ...

  2. 12.27 cf div3 解题报告

    12.27 cf div3 解题报告 wxy.wxy,带上分拉,全场做了个无脑小白 比赛场地 A: T1,跟着模拟就好了 B: sort一遍之后 去除的数一定是a[1]或者a[n] 比较去除谁小就输出 ...

  3. js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g)

    js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g) 一.总结 方括号:范围 圆括号:选 大括号:数量 1.js正则是在双正斜杠之中: var reg2=/[a-z]/ ...

  4. js进阶正则表达式9量词2(^和&作用:/^HTML5$/g匹配不到aHTML5b中的HTML5,不然是可以匹配到的)(/\d+(?=cm)/g)((?!cm))

    js进阶正则表达式9量词2(^和&作用:/^HTML5$/g匹配不到aHTML5b中的HTML5,不然是可以匹配到的)(/\d+(?=cm)/g)((?!cm)) 一.总结 ^和&作用 ...

  5. 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.特 ...

  6. CF(协同过滤算法)

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  7. CF 363B One Bomb(枚举)

    题目链接: 传送门 One Bomb time limit per test:1 second     memory limit per test:256 megabytes Description ...

  8. C++之路进阶——codevs2933(诗人小G)

    2933 诗人小G 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 小G是一个出色的诗人 ...

  9. 在Windows/Ubuntu下安装OpenGL环境(GLUT/freeglut)与跨平台编译(mingw/g++)

    GLUT/freeglut 是什么? OpenGL 和它们有什么关系? OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用.如果需要在程序里直接使用OpenGL, ...

  10. Asp.Net Mvc: 浅析TempData机制(转发 作者: Tristan G )

    Asp.Net Mvc: 浅析TempData机制 环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0 --------------------------- ...

随机推荐

  1. 从零开始学逆向CTF比赛,免费参加,欢迎来玩!

    大家好,我是轩辕. 告诉大家一个好消息:我准备了一次逆向CTF比赛,面向所有人开放,无需购买课程,优秀的小伙伴还有奖励,参赛方式在文末会介绍,欢迎大家一起来玩. 举办这次CTF比赛,是为了检验大家从零 ...

  2. Tortoise SVN 安装汉化教程(乌龟SVN)

    1.首先下载 去官网下载 如果下载比较慢的,链接自取 https://pan.quark.cn/s/cb6f2eee3f90 2. 安装Tortoise SVN 无脑next到完成 最后到桌面右键 你 ...

  3. MudBlazor:基于Material Design风格开源且强大的Blazor组件库

    项目介绍 MudBlazor是一个基于Material Design风格开源.免费(MIT License).功能强大的Blazor组件框架,注重易用性和清晰的结构.它非常适合想要快速构建Web应用程 ...

  4. 【鸣潮,原神PC端启动器】仿二次元手游PC端游戏启动器,以鸣潮为例。

    二游GAMELanucher启动器 1.前言 许多二次元手游(原神,鸣潮,少女前线)的PC端启动器都是使用Qt做的,正好最近正在玩鸣潮,心血来潮,便仿鸣潮启动器,从头写一个.先下载一个官方版的PC启动 ...

  5. 使用expected_conditions的url_changes方法判断是否登录成功

    使用expected_conditions的url_changes方法判断是否跳转页面登录成功 from selenium import webdriver from selenium.webdriv ...

  6. Microsoft.Extensions.AI 初探

    .NET Conf上的介绍 在今年的.NET Conf上Steve Sanderson带来了题为"AI Building Blocks - A new, unified AI layer&q ...

  7. 五、FreeRTOS学习笔记-任务创建和删除(动态方式)

    1任务控制块:保存任务的一些信息 (STM32的栈是由告高地址向低地址延伸的,由上向下生长) (STM32的堆是由告低地址向高地址延伸的,由下向上生长) 第一步申请内存 如下如所示步骤找到xTaskC ...

  8. 解析HTML字符串成AST树

    1. 如何将一个字符传转换成一个AST树结构. 直接上代码: const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:" ...

  9. JDK 18 及以上使用标准输出流中文输出乱码问题

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 链接:https://stazxr.cn/2024/12/05/JDK-18-以上使用标准输出流中文输出乱码问题/ 来源:終わり ...

  10. Prime2_解法二:openssl解密凭据

    Prime2_解法二:openssl解密凭据 本博客提供的所有信息仅供学习和研究目的,旨在提高读者的网络安全意识和技术能力.请在合法合规的前提下使用本文中提供的任何技术.方法或工具.如果您选择使用本博 ...