xj4604 排序

\(n,k <= 1e5\).

先考虑二分出这个值,check 有多少段的平均值小于这个 mid,这个在之前的复活赛中是原题 T4,数形结合,$ \text{Average} = \frac{Sum_i-Sum_j}{i-j} $,可以把它看做一个两点间的斜率公式——每个位置把它搞到平面上的点对 \((i,Sum_i)\),求有多少点对的斜率小于 mid。把它分成每个点的贡献——分别求一个点左侧有多少点能与它斜率小于等于 mid,过每个点作一条斜率为 mid 的直线,求出纵截距 \(-mid \times i + Sum_i\),这就是一个二维偏序问题了,用归并排序就行。

考虑怎么优化掉一个 \(\log\)——不妨把每个点的这个截距式看做以 \(mid\)为变量的函数,可以得到这样的东西——

上面的每一个交点都代表一个区间的平均值,求横坐标第 k 大的交点—— k 不是很大,所以就可以这么求:从左到右扫,假设我们知道线段在当前横坐标、的按照纵坐标的排序的结果,那么下一个交点肯定由相邻的两条线段得到;然后我们再扫到下一个交点的横坐标,显然只有这两条线段的上下关系发生变化,交换一下就可以得出下一个序列......差不多就是这个意思,代码见 Peanut_Tang 学长的 代码

xj4591 program

\(n,a,b <= 3e2\).

直接上状态:设 $f[i][j][k] $表示现在在枚举第 i 行字符串、枚举到了第 j 个位置、当前连续段长度为 k 的最小代价,于是可以得到转移方程:

\[f(i,j,k)=\left\{
\begin{aligned}
\min\{f(i,i-j,k')+(j-k)^2 \}\ (j \not= k)\\
\min\{f(i-1,b_i,k')+(j-b_i+a_i-a_{i-1})\} (j=k)
\end{aligned}
\right.\]

上面的方程是四次方的,下面的是三次方的,只要优化上面的就行了。展开之后用上斜率优化就行了。有的时候,状态的设置要清楚明确一点,分情况来写,就非常有利于分析。

xj4592 birthday

巧妙的构造题(数竞内鬼题)。

我们构造如下:

可以通过巧妙的递归来实现:


int f[maxn][maxn][maxn]; void dfs(int x, int y, int z, int dep)
{
if (z <= 0) return;
if (f[dep][x][y]) return;
f[dep][x][y] = z;
dfs(x - 1, y, z - 1, dep + 1);
dfs(x, y - 1, z - 2, dep + 1);
dfs(x, y + 1, z - 3, dep + 1);
dfs(x + 1, y, z - 4, dep + 1);
} int main()
{
//vector<oper> v;
int n;
cin >> n;
dfs(105, 105, n, 1);
for (int i = 200; i; i--)
{
for (int j = 200; j; j--)
{
for (int k = 200; k; k--)
{
if (f[i][j][k])
{
cout << j << " " << k << " " << f[i][j][k] << endl;
}
}
}
}
return 0;
}

华灵「蝶妄想」 (butterfly)

又是一道构造题,有一个东西我们是知道的——若我们把第一行选上了,那么必然会破坏掉 \(\frac{1}{2}m\) 列。同理,最后一行、最后一列、第一列都不值得选上——若我们能构造出方案数与\(n\)、\(m\)呈系数为一的方法,那么当\(n \leq 4\)时肯定是必须这么做更优——于是我们可以得到一个答案为 \(n+m-4\) 的构造:

当\(n\)足够大时,这个是最优的,但是\(n=2\)和\(n=4\)要特判。

樱符「完全墨染的樱花」 (sakura)

\(n<=1e5,m<=5e5\).

显然这张图是一个仙人掌,先来考虑树的情况怎么做。

大胆的运用最大流最小割定理,两点之间的最大流就等于它们路径上的最小值。这个东西最难优化的地方在于求最小值,所以我们把边权从小到大依次加入,新加入的这条边就是它联通的两个连通块之间的点对的最大流的值。于是我们用并查集统计这一过程的贡献;具体来说,维护每个连通块的\(p^c\)之和与\(p^{c(n-1)}\)之和,每次合并的时候加上这条边的贡献就行了。

然后考虑仙人掌怎么做。由于环没有重叠,我们分成一个个环来讨论:可以发现把每个环上的最小的边去掉,并把它的容量加到这个环的其他边上,这个新的树的最小割和原来的最小割完全等价,在这棵树上按照原来的方法统计就行了,用树上差分更新权值就能保证复杂度。

正确性的证明:显然。

xj4584 随机游走

你从 A 出发,接下来的每一天,你会从 x 达到 (x+f(x))modM,问 N−1 天后你的位置,其中 f(x) 表示 x 十进制表示中最大的数码。

\(n<=1e6\)直接暴力、\(m<=1e6\)开个桶找循环节,这都简单。考虑怎么优化。

这是一道求值的题目,又推不出什么式子,所以只能考虑倍增。我们先把它增大到$

咕着咕着

幽曲「埋骨于弘川」 (buried)

跟上一题做法类似,也咕着吧。

燃烧的火焰 (flame)

\(\Theta(n2^k\log n)\)做法就比较显然,枚举k中每个点选还是不选,以这个点集为起点,跑一遍最短路就行了,看一下最短路最远的那个点的距离是否比原答案大。

事实上我们发现我们根本不用跑这么多次的最短路,我们只需要跑 \(k\)次最短路就可以了。形式化的,若当前枚举到的子集是\(T\),则点\(x\)的最短路就是\(\max_{i\in T}\{dis_{i,x}\}\)。那我们要求的,就是

\[\sum_{T\in S}\{[\max_{i\in T}\{dis_{i,x}\}=ans]\}
\]

的子集T的个数。我们直接处理这个 \(k\) 显然过于困难。由于每个点的对答案的限制是分别独立的,所以单独看一下一个点的贡献:出发点们到它的距离有些小于答案,有些大于答案;当且仅当选出的出发点全部属于这个距离大于答案的点集时,它会不合法。所以我们开一个\(2^k\)的桶,每次把这个集合和它的子集全部删掉。如何快速删除子集呢?考虑离线下来一起处理。从大到小扫描桶的值域,当扫到一个删掉的集合时,枚举去掉它的哪一位,把这\(k\)个集合设为非法;否则 ans++。

这么做显然是不重不漏的,巧妙的不得了。

消失的序列 (stack)

喵喵喵啊!lzy: 对于栈的计数问题,有一种常见的数形结合方法:

图中,向右的一条边代表了一次入栈,向上的一条边代表了一次出栈;由于入栈和出栈序列已经定下来了,所以每条边的边权就已经定下来了,如图所示;一条从\((0,0)\)到\((n,n)\)路径对应了一种入栈和出栈的方式;我们要统计\(a\)数组的个数,其实每个\(a\)数组与\((0,0)\)到\((n,n)\)的路径也一一对应,因为根据出栈序列和路径可以还原出唯一且存在的入栈序列。现在考虑加上这个\(a_{pos}=x\)的限制,如图:

枚举\(pos\)位置的高度,由于出栈的限制,我们可以得出它必定经过上边的那个出栈序列;现在问题就转化为从\((0,0)\)到\((pos,high)\)再到那个再到\((n,n)\)的方案数的乘积。这个方案数怎么求呢?

用总的方案数\(C_{2n}^n\)减去不合法的方案数。发现不合法的方案一定会经过\(y=x+1\)那条线,若把这些方案沿\(y=x+1\)翻转,于是它最后会到达点\((n-1,n+1)\);我们大胆猜想:不合法的方案与从\((0,0)\)到\((n-1,n+1)\)的方案数一一对应,合法的方案数就是\(C_n=C_{2n}^n-C_{2n}^{n-1}\)。类似的,若三角形是\((n,m)\),那么不合法就是从\((0,0)\)走到\((m-1,n+1)\),合法方案数就是\(C_{n,m}=C_{n+m}^n-C_{n+m}^{n+1}\),这个叫类卡特兰数。

另外,许多问题(如节点数是\(n\)的二叉树个数)可以通过\(O(n^2)\)的递推式$C_n=\sum_{j=0}^{n-1} C_j C_{n-j-1} $ 来证明答案是卡特兰数。具体右转 lzy 大佬的 Blog

9 Days 停课修炼题解集的更多相关文章

  1. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  2. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  3. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  4. Codeforces题解集 1.0

    记录 Codeforces 2019年12月19日到 2020年2月12日 的部分比赛题 Educational Codeforces Round 82 (Rated for Div. 2) D Fi ...

  5. CSP-S2019 停课日记

    前言 不想上文化课,于是就停课了 (雾) \(10.13\) 停课前一天 今天名义上是放假,所以不算停课. 老师和同学们听说我要停课,都十分的不舍.我啥也没说就悄悄溜到一中来了. \(10.14\) ...

  6. ZJOI2019一轮游记

    Preface 期待已久的省选终于开始了233,关于之前的一些内容,在ZJOI2019一轮停课刷题记录都可以找到,这里不再赘述 ZJOI2019,Bless All Day -1 今天难得有休息,昨晚 ...

  7. OI总结

    当下考的钟声叮当响起,该走了,一年半的OI竞赛就此结束 留下了很多遗憾.也拥有过一段美好的竞赛生活 结识了一群优秀的OI战友,一起进步一起开心一起忧愁,但这一切的一切都将在今晚变成过去式,CSp的好与 ...

  8. 闭关修炼屯题中,期末考完A

    FJUTOJ 1279 #include <cstdio> #include <iostream> #include <algorithm> #include &l ...

  9. 玉伯的一道课后题题解(关于 IEEE 754 双精度浮点型精度损失)

    前文 的最后给出了玉伯的一道课后题,今天我们来讲讲这题的思路. 题目是这样的: Number.MAX_VALUE + 1 == Number.MAX_VALUE; Number.MAX_VALUE + ...

随机推荐

  1. 什么,你还使用 webpack?别人都在用 vite 搭建项目了

    一.vite 到底是干嘛的? vite 实际上就是一个面向现代浏览器,基于 ES module 实现了一个更轻快的项目构建打包工具. vite 是法语中轻快的意思. vite 的特点: 1.轻快的冷服 ...

  2. 【UE4 C++ 基础知识】<15> 智能指针 TSharedPtr、UniquePtr、TWeakPtr、TSharedRef

    基本概念 UE4 对 UObject 对象提供垃圾回收 UE4 对原生对象不提供垃圾回收,需要手动进行清理 方式 malloc / free new / delete new与malloc的区别在于, ...

  3. MySQL复习(二)MySQL基本数据类型

    MySQL基本数据类型 常用的字段类型大致可以分为数值类型.字符串类型.日期时间类型三大类 1. 数值类型 数值类型可以分为整型.浮点型.定点型三小类. 1.1 整型 (tiny:极小的, small ...

  4. BUAA_2020_软件工程_热身作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 热身作业要求 我在这个课程的目标 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪个具体方面 ...

  5. 对dy和Δy的浅薄理解

    一.导数定义 当函数y=f(x)的自变量x在一点x0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在x0处的导数,记作f'(x0)或df(x0) ...

  6. python numpy版本报错: File "*\numpy\__init__.py", line 305, in <module> _win_os_check()

    具体代码如下所示: from numpy import * import operator a = random.rand(4, 4) print(a) 具体报错内容如下所示: Traceback ( ...

  7. PCIE学习链接集合

    <PCIE基础知识+vivado IP core设置> https://blog.csdn.net/eagle217/article/details/81736822 <一步一步开始 ...

  8. linux updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'

    我们想查找我们最新创建的文件时,由于locate的数据库是每天更新.所以我们新创建的文件还没有被更新到系统的数据库. 这是需要手动更新数据库. 然后就可以查到. updatedb 输出 updated ...

  9. 二进制小数 牛客网 程序员面试金典 C++ Python

    二进制小数 牛客网 程序员面试金典 题目描述 有一个介于0和1之间的实数,类型为double,返回它的二进制表示.如果该数字无法精确地用32位以内的二进制表示,返回"Error". ...

  10. 无缓存交换 牛客网 程序员面试金典 C++ Python

    无缓存交换 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值. 给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回 ...