2019/8/27 Test(luogu 五月天模拟赛)
\(2019/8/27\)大考
\(\color{#ff0808}{\text{初二诀别赛(SAD)}}\)

| 题目名称 | 链接 |
|---|---|
| 寿司 | \(BSOJ5111\) |
| 秀秀的森林 | \(BSOJ5125\) |
| 分组 | \(BSOJ5126\) |
| 入阵曲 | \(BSOJ5129\) |
| 将军令 | \(BSOJ5130\) |
| 文本编辑器 | \(BSOJ5089\) |
【第一题】
\(\color{#0080FF}{\underline{\large{题面}}}\)
【简述】
有一个由\(R\)和\(B\)组成的字符串环,每次可以交换相邻两个字符,问最少需要交换多少次使得\(R\)在一起,\(B\)在一起
【题解】
法一:
变环为链后我们就是要让一种同类元素聚在中间
我们可以发现,我们一定可以找到一个"断点"或者"中间点",使得这个点同类的点都向它靠,不同类的都向两边散开
我们假设这个种类的点是\(B\),则向两边走的是\(R\)
关键问题是,我们并不知道最优解的那个循环同构串是那个,因此要枚举
以\(i\)开始的循环同构串在两倍串中是\([i,i+len-1]\)
第一个问题:如何计算一个点\(x(\in[l,r])\),将\([l,x]\)的所有的\(R\)移到\([l,r]\)最左边,将\([x+1,r]\)的所有\(R\)移到\([l,r]\)最右边
这里很简单还是写一下公式但自己推意思
设\(bl_i\)表示\(i\)(为\(R\))位置以左有多少个\(B\),也就是它向左移会与那么多个\(B\)交换
设\(br_i\)表示\(i\)(为\(R\))位置以右有多少个\(B\),同上
设\(rl_i\)表示\(i\)(为\(B\))位置以左有多少个\(R\),同上
设\(rr_i\)表示\(i\)(为\(B\))位置以右有多少个\(R\),同上
则把\(i\)位置以前的\(R\)(包含\(i\))全部向左移的代价是\(sl_i=\displaystyle{\sum_{j=1}^i}[str_j=\text{'R'}]\cdot bl_j\)
把\(i\)位置以后的\(R\)(不包含\(i\))全部向右移的代价是\(sr_i=\displaystyle{\sum_{j=i+1}^n}[str_j=\text{'R'}]\cdot br_j\)
这两句话的意思是向两边挤的最小交换次数就是由两边向内,每个\(R\)都与其外侧的'B'交换,用这种顺序是可以实现的
则我们得出\(val_{l,x,r}=\\sl_x-sl_{l-1}+\\bl_{l-1}\cdot(ll_x-ll_{l-1})+\\sr_{x+1}-sr_{r+1}+\\br_{r+1}\cdot(lr_{x+1}-lr_{r+1})\)
四堆分别表示\([l,x]\)全部移到\([1,n]\)最左边的代价
\([l,x]\)已经在\([l,r]\)最左边再移到\([1,n]\)最左边的代价
\([x+1,r]\)全部移到\([1,n]\)最右边的代价
\([l,x]\)已经在\([l,r]\)最右边再移到\([1,n]\)最右边的代价
相当于抵消了多余贡献
这样我们就可以求出每个循环同构串在特定断点的答案了
但这样是\(O(n^2)\)的
发现在同一循环同构串内答案是单峰的且随循环同构串后移答案下标单调
考试时未证明
\(\color{#0080ff}{\underline{Code}}\)
法二:
参见\(ppt\)
中位数思想,也可以证明上面的单调性
\(\color{#0080ff}{\underline{Code}}\)
【第二题】
【简述】
有一颗初始的树,求按照一定顺序删边每个时刻每棵树直径的乘积
【题解】
化删边为加边,问题变成合并两个联通快直径,有一个结论,这个新直径两端一定均为原两直径两端
因此在原树上跑\(ST\),就可以\(O(1)\)求两点距离
实现中用并查集记录连通块直径以及两端,用乘法逆元抵消合并前两直径
\(\color{#0080ff}{\underline{Code}}\)
【第三题】
求序列的划分方案使得同一段
【第四题】
\(\color{#0080FF}{\underline{\large{题面}}}\)
【简述】
求有多少个子矩阵满足和为\(k\)的倍数
【题解】
不妨思考一个简单易懂的问题
求一个一维的序列有多少个子串和为\(k\)的倍数
我们将其转为前缀和\(\{sum\}\)(含\(sum_0=0\))后就是问有多少对数的差为\(k\)的倍数(有序)
也就是有多少对数的差为\(0\)在\(\mod k\)剩余系下
这个问题我们可以轻易做到\(O(n^4)\)即把一个矩阵的和真的算出
有一道题用了一个转化可以参考最大子矩阵
就是我们把同样\((y1,y2)\)的矩阵系看成一些数,即我们确定两条线确定矩阵的上下边界的那些矩阵
问题就转化为了简单的一维问题
\(\color{#0080ff}{\underline{Code}}\)
【第五题】
\(\color{#0080FF}{\underline{\large{题面}}}\)
【简述】
每个关键点可以覆盖与它距离\(\le~k\)的点,求覆盖整棵树最少需要选多少个关键点
【题解】
\(k=1\)是经典的看点\(dp\)
\(k=?\)一个玄妙的贪心
我们从叶子节点至下向上,记录两个值\(maxl_i\)表示在\(i\)的子树中没有被覆盖的点最大距离、
\(dis_i\)表示被\(i\)的儿子覆盖的最大剩余距离,也就是\(i\)的某个孙子管了\(i\)后还剩的距离
如果\(maxl_i\le dis_i\)就是被覆盖了的
而相反就将\(i\)置关键点
特殊情况就是如果\(1\)没有被覆盖其实被少覆盖所有剩余包含\(1\)的连通块要多选一次
\(\color{#0080ff}{\underline{Code}}\)
【第六题】
懒标记思想
、 、、、、、、、、、、、、、、、、、、、、、、、、 、 、 、、 、、
\(\color{#0080FF}{\underline{\large{题面}}}\)
这道题没有翻转的话就是很简单的双向链表(还是写错了)
\(UPD\)双向链表模板
inline void Link(re int x,re int y){p[x].r=y;p[y].l=x;}
inline void Cut(re int x,re int y){p[x].r=p[y].l=0;}
考虑左右光标错位前一定到达过\(l-r\)或\(r-l\)的位置,因此在\(Link\)中加一句话维护左光标是否在右光标左
if(x==l&&y==r)flag=1;if(x==r&&y==l)flag=0;
很好实现几个除了翻转的操作
inline char Del(re int x){
re int rs=p[x].r,rrs=p[rs].r;
if(rs==t)return 0;
Cut(x,rs);Cut(rs,rrs);
Link(x,rrs);
return 1;
}
inline char goleft(re int x){
re int ls=p[x].l,rs=p[x].r,lls=p[ls].l;
if(ls==s)return 0;
Cut(lls,ls);Cut(ls,x);Cut(x,rs);
Link(lls,x);Link(x,ls);Link(ls,rs);
return 1;
}
inline char goright(re int x){
re int ls=p[x].l,rs=p[x].r,rrs=p[rs].r;
if(rs==t)return 0;
Cut(ls,x);Cut(x,rs);Cut(rs,rrs);
Link(ls,rs);Link(rs,x);Link(x,rrs);
return 1;
}
\(\color{#ff0000}{\large{\text{血的教训}}}\)\(\color{#ff0000}{\text{:对两个光标一定要分别建点,因为如果不建,当两个光标重合时就无法判断它到底还有几个位置可以走,}}\)
对于\(Reverse\)操作:
考虑暴力:要翻转\([x,y]\)的节点时,只有\(x,y,l_x,l_y\)的前驱后继值会被真正改变,其余都是交换前驱后继即可
我们可否利用懒标记思想呢,答案是可以的,考虑

我们其实只需要修改\(lr,rl\)的前驱后继为\([0,r],[l,0]\)
在调用\(l\)的后缀的后缀或\(r\)的前缀的前缀时我们就会发现它的前缀的后缀或后缀的前缀不等于自己因此交换即可
inline void pushdown(re int x){
re int ls=p[x].l,rs=p[x].r;
if(p[ls].r!=x)swap(p[ls].l,p[ls].r);
if(p[rs].l!=x)swap(p[rs].l,p[rs].r);
}
注意一下这个\(pushdown\)一定是由外向内的
因此如果有本来在\([l,r]\)中但要出去的都要先\(pushdown\)才能得到正确前驱后继
\(\color{#0080ff}{\underline{Code}}\)
【总结】
本次考试并未涉及到任何高级数据结构虽然可以用来骗分
但考察了一些经典思想:中位数思想,延迟标记思想
2019/8/27 Test(luogu 五月天模拟赛)的更多相关文章
- 2019.03.27【GDOI2019】模拟 T3
题目大意 给出$n$, $p$, 求有多少长度为$n$的排列可以被分成三个上升子序列, 数量对$p$取模, 数据范围 $3 \leq n \leq 500$. 思路 首先让我们考虑如果有一个排列,如何 ...
- 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)
Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: ...
- 『2019/4/9 TGDay2模拟赛 反思与总结』
2019/4/9 TGDay2模拟赛 今天是\(TG\)模拟赛的第二天了,试题难度也是相应地增加了一些,老师也说过,这就是提高组的难度了.刚开始学难的内容,一道正解也没想出来,不过基本的思路也都是对了 ...
- 『2019/4/8 TGDay1模拟赛 反思与总结』
2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...
- 3.27模拟赛 sutoringu(后缀数组)
\(\color{white}{mjt是机房模拟赛独自切过题的唯一的人...}\) (应本人要求删掉惹) \(Description\) 给你\(n,k\)和长为\(n\)的字符串\(s\).一个区间 ...
- 「CSP-S模拟赛」2019第四场
「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...
- 2019.3.16 noiac的原题模拟赛
RT,这太谔谔了,我不承认这是模拟赛 但是虽然是搬了三道题,题目本身也还能看,就这么着吧 (怎么机房里就我一道原题都没做过啊 T1 CF24D Broken Robot 比较简单地列出式子之后,我们发 ...
- 2019.7.26 NOIP 模拟赛
这次模拟赛真的,,卡常赛. The solution of T1: std是打表,,考场上sb想自己改进匈牙利然后wei了(好像匈牙利是错的. 大力剪枝搜索.代码不放了. 这是什么神仙D1T1,爆蛋T ...
- 模拟赛小结:2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest
2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest 2019年10月11日 15:35-20:35(Solved 8,Penalty 675 ...
随机推荐
- Spring全家桶注解一览(精选)
废话 最近想整理一波Spring注解相关的文章,虽然写CURD就只涉及到那些常用的注解.但是笔者我也想去了解一下其他注解,丰富下自己的知识面(提升一下逼格!). 就想在网上搜了半天,好像大家的都差不多 ...
- Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法
最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...
- Governing sand(主席树/贪心)(2019牛客暑期多校训练营(第七场))
示例:输入:25 1 11 10 125 1 23 2 3输出:12 题意:n种树,第i种树有P[i]颗,砍掉每颗树的代价是C[i], 高度是H[i].需要用最小的花费砍掉一些树,让最高的树超过一半. ...
- 【scratch3.0教程】 2.3 奥运五环
(1)编程前的准备 在设计一个作品之前,必须先策划一个脚本,然后再根据脚本,收集或制作素材(图案,声音等),接着就可以启动Scratch,汇入角色.舞台,利用搭程序积木的方式编辑程序,制作出符合脚本的 ...
- Jenkins + GitLab + SpringBoot 实现持续集成脚本
Linux脚本 #!/bin/bash jar_name=hq-api.jar cd /usr/local/app/hq-api echo "Stopping SpringBoot Appl ...
- C# 连接SQLServer数据库自动生成model类代码
Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading ...
- ZK中使用JS读取客户端txt文件内容问题
最近写一个需求时遇到一个问题,用户需要通过点击一个按钮直接读取他自己电脑上D盘的一个txt文件内容显示到页面,因为项目现在是用ZK写的.我对于ZK也是刚刚了解不就,很多都还不是很熟.起初我是想用io流 ...
- 刚接触HTML5应该先学哪里才好?
好吧,话不多说,直接来点干货吧! 刚接触html的小白都感觉摸不着头脑?应该怎么学习呢,其实HTML5可能对于还没有接触过的小白来说会比较的难,听起来也比较新颖.这是个什么骚东西!其实不然,这个就是构 ...
- 超详细Vue实现导航栏绑定内容锚点+滚动动画+vue-router(hash模式可用)
超详细Vue实现导航栏绑定内容锚点+滚动动画+vue-router(hash模式可用) 转载自:https://www.jianshu.com/p/2ad8c8b5bf75 亲测有效~ <tem ...
- PHP基础之输出缓冲区基本概念、原理分析
一.概念 在PHP运行的过程中,可以将会产生输出的函数或操作结果暂时保存在PHP的缓冲区,只有当缓冲区满了.或者PHP运行完毕.或者在必要时候进行输出,才会将数据输出到浏览器,此缓冲数据的区域称为PH ...