Mysterious Present
Mysterious Present题面翻译给出一个限制 $(w,h)$ 和 $n$ 个物品的二维信息$(w_i,h_i)$ 求物品二维都满足 $w_i>w,h_i>h$ 的前提下的最长二维严格上升子序列以及其长度$(w_i>w_{i-1},h_i > h_{i-1}$ ) 如果找不到任何一个物品满足条件 只需输出一行 0 ( $1<=n<=5000$ , $1<=w,h<=10^{6},1<=w_{i},h_{i}<=10^{6}$ ). 分析首先对于 $w_i\le w 且 h_j \le h$ 的 $i$ 不应当考虑。接下来就是一个二维的最长上升子序列的问题了,可以对信封进行一个排序。注意到 $n$ 的只有 $5000$ ,$O(n^2)$ 解决。 (绝对不是不会 $n log n$) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647...
String Reversal
String Reversal题目描述给定一个长度为$n$的字符串$A$,$B$为翻转后的$A$字符串。 请你求出$B$最少需要多少次相邻字符互换操作才能与$A$完全一致。 $1\le n \le 2\times10^5$ 分析 Written with StackEdit中文版.
Dynasty Puzzles
Dynasty Puzzles题面翻译题目描述有一个王朝,他们国王的名字用姓氏的简写来标记每一代。为了保证王朝的稳定,现在这个王朝的继承人的名字需要满足继承者名字的第一个字母要和前代名字最后一个字母相同。然后拼接起来的名字,第一个字母和最后一个字母相同。现在有一个考古博士,知道了这个王朝国王和亲戚的名字。问你这个王朝所能够得到的最长字符串。 输入第一行一个整数n(1≤n≤5·1e5),接下来n行,每行一个非空字符串,全由小写字母组成,字符串长度不超过10 输出最长满足要求的长度,如果没有输出0 构成的字符串必须按输入顺序首尾相接,不能乱序拼接。 分析理解:给定一些字符串,希望找到最多的字符串,使得他们按照给出的顺序收尾拼接成一个字符串,需要保证最后的字符串首尾相同。 考虑到字符串的拼接一定要按照给出的顺序,即第 $i$ 个字符串一定要接在第 $j$ 个 $(1 ≤ j < i)$ 字符串后面,满足了无后效性(是吗?),这启发我们可以dp解决这个问题。 不妨假设 $f[a][b]$ 表示以字符 $a$ 开头, 字符 $b$ 结尾的最长长度。最后的答案即为 $\max_{ch ...
Queries for Number of Palindromes
Queries for Number of Palindromes题目描述给你一个字符串s由小写字母组成,有q组询问,每组询问给你两个数,l和r,问在字符串区间l到r的字串中,包含多少回文串。 输入格式第1行,给出s,s的长度小于5000第2行给出 $q \ (1 <= q <= 10^6)$ 分析对于每次询问,暴力求解的时间复杂度肯定不行。 注意到字符串的长度不是很大,考虑预处理每一个区间的回文串个数。 设 $f[i][j],\ g[i][j]$ 分别表示区间 $[l, r]$ 是否是回文串和其所有子区间的回文串总和。 $f[i][j]$ 的很好处理, 思考 $g[i][j]$ 的转移,发现其本质上是一个二维前缀和的问题: $g[i][j] = g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1]$ 而对于 $f[i][j]$ ,枚举每一个回文中心,向两边拓展,注意长度的奇偶性。 1234for (int i = 1; i <= n; i++){ for (int l ...
Choosing Capital for Treeland
Choosing Capital for Treeland题面翻译Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市。每条道路只能单向通行。现在政府需要决定选择哪个城市为首都。假如城市i成为了首都,那么为了使首都能到达任意一个城市,不得不将一些道路翻转方向,记翻转道路的条数为k。你的任务是找到所有满足k最小的首都。 输入格式输入包含多个测试点。对于每个测试点,每个测试点的第一行为一个正整数n($2<=n<=2·10^{5}$)。接下来 n-1 行,每行两个正整数 $a_i$,$b_i$ ,表示城市a到城市b有一条单向通行的道路。输入以空格分隔,以EOF结尾。 输出格式对于每个测试点,第一行输出k,第二行升序输出所有满足条件的首都的编号。 分析发现自己写的时候根本没有发现有多组数据,实际上就根本没有多组数据。。。 我们发现,如果选定某一个点作为首都,可以 $O(n)$ 求出所对应的道路。 但实际上,一共有 $n$ 个点可以作为首都,如果逐个考虑, $O(n^2)$ 难以接受! 不妨考虑答案之间的联系。 如果记以 $u$...
Boredom
Boredom题面翻译题目描述给定一个有 $n$ 个元素的序列 ${a_n}$。你可以做若干次操作。在一次操作中我们可以取出一个数(假设他为 $x$)并删除它,同时删除所有的序列中值为 $x+1$ 和 $x-1$ 的数。这一步操作会给玩家加上 $x$ 分。 输入输出格式输入格式:第一行一个整数 $n(1\le n\le 10^5)$,说明这个序列有多少数。 第二行 $n$ 个整数,分别表示 $a_1,a_2,\cdots,a_n$。($1 \le a_i \le 10^5$ ) 输出格式:一个整数,表示玩家最多能获得多少分。 说明: 对于样例 3,第一步我们取 $2$,序列变为 $[2,2,2,2]$。接下来每一步都取 $2$,最后获得 $10$ 分。 分析观察数据范围可知, $a_i$ 并不是非常大,考虑从这一点入手解决问题。 观察发现序列的顺序并不重要,首先想到的是对序列排序。进一步,可以统计每一个数字出现的次数。注意到,有一个贪心的结论: 如果取了一个数 $x$ 且这个数出现了不止一次,那么我们可以把出现的所有的 $x$ 都取光,这只会使得答案更优。 开一个桶统计每一...
The Great Mixing
The Great Mixing题面翻译有k种可乐,第i瓶可乐的CO2浓度是ai/1000,问要配置出浓度n/1000的可乐,最少需要几瓶可乐。 $0<=n<=1000$ , $1<=k<=10^{6}$ ,$0<=a_{i}<=1000$ 输入: 第一行n和k。 第二行k个整数,第i个整数表示ai。 输出: 一行,表示最少需要几瓶,无解输出-1。 分析题面翻译一点也不好看! 简单分析后发现这个千分之一可以直接去掉,考虑分子即可: 每个数可以用很多次,找出最少的数字,使它们的平均数为 $n$ 。 为了方便,其实可以将每一个数先减去 $n$ , 问题就简单一些了: 每个数可以用很多次,找出最少的数字,使它们的平均数为 $0$ 我们可以用bfs搜索每一个数字出发到达 $0$ 的最短路径。 123456789101112131415161718192021222324252627282930313233343536#include <bits/stdc++....
Marvolo Gaunt's Ring
Marvolo Gaunt’s Ring题面翻译给了三个数: $p,q,r(-1e9<=p,q,r<=1e9)$ 然后给了n个数$a_1,a_2…a_n(-1e9<=a_i<=1e9)$ 求找出三个数$a_i,a_j,a_k(1<=i<=j<=k<=n)$使得$p\times a_i+q\times a_j+r\times a_k$最大。 分析这是一道十分简单的“三元组”问题,套路很简单: 枚举中心点 $j,\ O(1)$ 找到最大的 $i, j$。对于这一道题目,需要处理前缀最大值和后缀最大值即可。 12345678910111213141516171819202122232425262728293031#include <bits/stdc++.h>#define int long longusing namespace std;const int N = 1e5 + 5;int n, p, q, r, ans = LONG_LONG...
[NOIP2013 提高组] 火柴排队
[NOIP2013 提高组] 火柴排队题目描述涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$\sum (a_i-b_i)^2$。 其中 $a_i$ 表示第一列火柴中第 $i$ 个火柴的高度,$b_i$ 表示第二列火柴中第 $i$ 个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 $10^8-3$ 取模的结果。 对于 $100%$ 的数据,$1 \leq n \leq 10^5$,$0 \leq$ 火柴高度 $< 2^{31}$。 分析依题意模拟即可 注意到,可以随意对两个数组进行排序。 分析可知若需要 $\sum (a_i-b_i)^2$ 最小,可以让两数组都有序(单调性相同)。 如果考虑对两个数组都进行若干次交换,情况太复杂了。 发现这完全可以转化为只对其中一个数组的交换(比如说 $b_i$)。 又注意到,这两个数组的对应位置是相...
[P2073](https://www.luogu.com.cn/problem/P2073) 送花
P2073 送花 这是一道模拟题 题目背景小明准备给小红送一束花,以表达他对小红的爱意。他在花店看中了一些花,准备用它们包成花束。 题目描述这些花都很漂亮,每朵花有一个美丽值 $W$,价格为 $C$。 小明一开始有一个空的花束,他不断地向里面添加花。他有以下几种操作: $1\ W\ C$:添加一朵美丽值为 $W$,价格为 $C$ 的花。 如果此时花束中已经有了相等价格的花,那么这朵花不能加入花束。 $2$:删除当前花束里最贵的一朵花。 $3$:删除当前花束里最便宜的一朵花。 $-1$:完成添加与删除,开始包装花束。 当花束为空时,忽略操作 $2$ 和 $3$。 请你写一个程序,计算出开始包装花束时,花束中所有花的美丽值的总和,以及小明需要为花束付出的总价格。 输入以 $-1$ 结束。记总操作数为 $m$ 。 对于全部数据,$m \le 10^5$,$1\le W,C\le 10^6$。 分析01-暴力维护一个序列,每次操作都遍历模拟解决,显然不行。 02-性质发现本质上维护的是一个“花束”。注意到花束内部并没有顺序之分,联想到集合set。 03-正解想到这一点,这道...