本文主要是介绍2019.8.7 金华正睿集训总结Day11(ACM),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
8.7
在这个欢乐的七夕佳节,我们迎来了欢乐的ACM
于是,在和yjz大佬和yy大佬严肃(?)讨论后,我们的队名就叫七夕“快乐”(为什么加引号就不说了,qq情头是和小号的某)
在前一天,去商场的时候看到几个小朋友手上粉色爱心型的气球,某和yjz大佬拉着yy大佬绕着商场走了一圈找到了发气球的那家店,愣是没好意思进去要,结果回来的路上,十分幸运的看到地上有个,刚想去捡,只见一个老爷爷捉住气球,五指并拢,pong破了
嘤嘤嘤,表示惊恐,并且这次ACM的气球颜色显然比上次好看伱
下面是部分题解 (为什么是部分呢,因为另外一部分我还不会)
关于题目:玲珑骰(tóu)子安红豆,入骨相思知不知。——温庭筠
A - 玲
题面
ZhengRuCaiLaoBan在她的花园里种着一排N棵树。从左往右数的第i(1<=i<=n)棵树的高度为ai。今天ZhengRuCaiLaoBan决定修缮一下她的美丽花园。她想让树的高度们满足以下条件:对于所有的i(1<=i< n),ai+1-ai=k,其中k是ZhengRuCaiLaoBan选择的数字。
不幸的是,ZhengRuCaiLaoBan统治的ZhengRuCaiJi们不是效率非常高的机器,他们不能立即满足ZhengRuCaiLaoBan的愿望。在一单位时间内,ZhengRuCaiJi们只能做到将其中一棵树的高度降低到任意正整数高度,或者是将树的高度增加到任意正整数高度。ZhengRuCaiJi们应该如何在最短的时间内完成ZhengRuCaiLaoBan陛下的任务呢?
Input
第一行包含两个空格分隔的整数:n,k(1<=n,k<=1000)。第二行包含n个空格分隔的整数a1,a2,…,an(1<=ai<=1000)用于描述树的高度。
Output
第一行一个数表示ZhengRuCaiJi们所需要花费的最少时间p。接下来p行用来描述ZhengRuCaiJi们的操作
如果在某一步操作中ZhengRuCaiJi们想要将第i棵树的高度增加x个单位,那么就输出一行“+ i x”;如果是想要将第i棵树的高度减少x个单位,那么就输出一行"- i x"。
如果存在多组答案的话,你可以输入其中的任意一个。
Examples
样例输入1
4 1
1 2 1 5
样例输出1
2
+ 3 2
- 4 1
样例输入2
4 1
1 2 3 4
样例输出2
0
暴力推一推,比较一下
#include <bits/stdc++.h>
#define ll long long
#define lowbit(x) x & (-x)
#define memset(x) memset(x, 0, sizeof(x))
#define N 1000010
#define sc(x) scanf("%d", &x)
#define pr(x) printf("%d\n", x)
using namespace std;
int n, k, a[N], b[N], minn = 1e9, c[N];
int main()
{sc(n);sc(k);for (int i = 1; i <= n; i++){sc(a[i]);}for (int i = 1; i <= 1000; i++){b[1] = i;int sum = 0;if (b[1] != a[1]) sum++;for (int j = 2; j <= n; j++){b[j] = b[j - 1] + k;if (b[j] != a[j]) sum++;}if (sum < minn){minn = sum;for (int j = 1; j <= n; j++)c[j] = b[j];}}if (minn){cout << minn << endl;for (int i = 1; i <= n; i++){if (c[i] != a[i]) {if (c[i] < a[i]) printf("- %d %d\n", i, abs(c[i] - a[i]));else printf("+ %d %d\n", i, abs(c[i] - a[i]));}}}else cout << 0 << endl;return 0;
}
B - 珑
题面
ZhengRuCaiLaoBan想要最小化一棵树。他可以多次执行以下操作:选择一个顶点v,和两条长度相等、除了v外不相交的路径a0 = v, a1,…, ak, b0 = v, b1,…, bk,此外,顶点a1,…, ak, b1,…, bk在树中除了所在路径的相邻顶点外,不能有任何邻居。(邻居即为通过一条边直接相连的点对)然后,其中一条路径可以合并到另一条路径中,即顶点b1,…, bk可以有效擦除,如图所示:
帮助ZhengRuCaiLaoBan确定是否可以通过一系列上面描述的操作将一棵给定的树转换为路径,如果答案是肯定的,还请继续确定该路径的最短长度。
Input
输入的第一行包含顶点数n(2≤n≤2*10^5)。 接下来的n - 1行描述了这棵树。每一行包含两个空格分隔的整数u和v(1≤u, v≤n, u≠v),表示树上的一条边。
Output
如果无法通过题面中的操作得到路径,那么输出-1,否则输出最短的路径长度。
Examples
样例输入1
6
1 2
2 3
2 4
4 5
1 6
样例输出1
3
样例输入2
7
1 2
1 3
3 4
1 5
5 6
6 7
样例输出2
-1
Note
在第一个例子中,将路径2 - 1 - 6和2 - 4 - 5合并后得到一个长度为3的路径。
在第二个样例中不可能执行任何操作。例如,不可能合并路径1 - 3 - 4和路径1 - 5 - 6,因为顶点6还有一个邻居7,它不在对应的路径中。
C - 骰
题面
动物园最近举行了选举。总共有7个主要的政党:其中一个是小象党,另外6个政党的名字不那么好听。 政党发现他们的竞选编号非常重要。总共有m个可能的编号:1、2、……、m。这7个参与方中的每一个都将以某种方式被分配到一个编号上,在这种情况下,两个不同的参与方不能接收到相同的编号。 小象党成员相信幸运数字4和7。他们想要评估他们在选举中的机会。为此,他们需要找出,有多少个正确的分配使得小象政党的竞选编号中的幸运数字数位的数目严格大于其他6个政党的竞选编号中的幸运数字的总数。 请你帮小象政党算一下这个数字。由于答案可能相当大,所以将其除以1000000007(10^9 + 7)后的余数输出。
Input
单行包含一个正整数m(7≤m≤10^9)——竞选编号中可能出现的数字。
Output
一行一个答案,表示所有满足条件的分配方案在模10^9+7意义下的值。
Examples
样例输入1
7
样例输出1
0
样例输入2
8
样例输出2
1440
数位DP
D - 子
题面
今天是ZhengRuIOI暑期峰会的ACM大赛,同学们为了认识大家方便组队都坐成了一个圈,满足任意两个同学的连线都位于圈内,如果从上空看这边的情景,将大家的位置表示成二维平面上的点的话,同学们坐成的就是一个凸包。
同学们非常的不知道如何组队,但他们知道,一个队伍的默契值与他们目前所坐的位置形成的三角形面积成反比。也就是说,他们三人位置所形成的三角形面积越小,他们就越默契。但是当然,这个默契值不能为正无穷,也就是这个三角形的面积不能为0。
同学们想要找出能够组成的默契值最大的队伍长啥样,由于不清楚默契值与面积之间的具体换算公式,你只需要输出三角形面积的两倍就行了。
Input
第一行一个数n,表示人数。
接下来n行每行两个数,表示这个同学的坐标。
保证所有同学的坐标所形成的是个凸包,且输入是按照它们在凸包中的顺序逆时针给出的。
n <= 200000, |x_i|, |y_i| <= 10^9
Output
输出最小三角形面积的两倍
Examples
样例输入1
4
0 1
3 0
3 3
-1 3
样例输出1
5
样例输入2
3
0 0
1 0
0 1
样例输出2
1
样例输入3
4
-999999991 999999992
-999999993 -999999994
999999995 -999999996
999999997 999999998
样例输出3
3999999948000000156
因为是凸包,所以猜想最小面积三角形是由相邻的三个点组成的
关于证明,同底三角形高越大面积越大,显然相邻的点高最小
所以根据面积计算公式计算比较
E - 安
题面
一位非常勇敢的探险家ZhengRuCaiLaoBan决定去探索巴黎的地下墓穴。由于ZhengRuCaiLaoBan没有真正的经验,他决定只是将每个房间走一遍就算完成了任务。
地下墓穴由几个房间和一些房间对之间的双向通道组成。有些通道连接的是一个房间和它自身,由于通道是在不同的深度上建造的,所以它们之间不会相交。每一分钟,ZhengRuCaiLaoBan都会任意地从他现在所在的房间中选择一条相邻的通道,然后在一分钟内到达通道另一端的房间。当他在第i分钟进入一个房间时,他在他的日志上写下了一个数字ti:
如果ZhengRuCaiLaoBan以前去过这个房间,他会写下他上次到达这个房间的时间; 否则ZhengRuCaiLaoBan会严格地写下一个小于当前分钟i的任意非负整数。 起初,ZhengRuCaiLaoBan在第0分钟的时候在其中一个房间里,但他没有写下数字t0。
在他流浪期间的某个时候,ZhengRuCaiLaoBan累了,扔掉了他的探险日志,回家了。新一代的探索爱好者sshwy找到了他的探险日志,现在他很好奇:根据ZhengRuCaiLaoBan的探险日志,巴黎地下墓穴的最小房间数是多少?
Input
第一行一个数n,表示ZhengRuCaiLaoBan的探险日志中的笔记条数
第二行n个非负整数t_1, …, t_n,描述了所有的笔记。
n <= 2*10^5, 0 <= t_i < i
Output
一行一个数,表示巴黎地下墓穴的最少房间数。
Examples
样例输入1
2
0 0
样例输出1
2
样例输入2
5
0 1 0 1 3
样例输出2
3
Note
在第一个样例当中,ZhengRuCaiLaoBan经过的房间序列可能为 1 → 1 → 2, 1 → 2 → 1 或者 1 → 2 → 3. 其中房间数量的最小值是 2.
在第二个样例中,ZhengRuCaiLaoBan经过的房间序列可能为 1 → 2 → 3 → 1 → 2 → 1.
这是yy大佬做的,好像模拟一下就可以了
F - 红
题面
ZhengRuCaiLaoBan有一个长度为n的字符串,由小写和大写拉丁字母和数字组成。 他想重新排列s中的字符,并将其切割成最少的部分,使得每个部分都是回文串,并且所有部分的长度都相同。回文的定义为从前往后与从后往前读完全相同的穿,如“hannah”。 你的任务是帮助ZhengRuCaiLaoBan确定切割而成的等长回文的最小数量,允许在切割前重新排列s中的字符。
Input
第一行包含整数n(1≤n≤4·10^5)表示字符串s的长度。 第二行包含一个长度为n的字符串s,由小写和大写拉丁字母和数字组成。
Output
第一行输出一个数,表示你可以将该字符串切割而成的最少的等长回文串数量。
第二行满足第一问中数量的回文串切割方案,每两个字符串之间用一个空格分隔。可以输出任意合法解。
Examples
样例输入1
6
aabaac
样例输出1
2
aba aca
样例输入2
8
0rTrT022
样例输出2
1
02TrrT20
样例输入3
2
aA
样例输出3
2
a A
G - 豆
题目
ZhengRuCaiLaoBan很喜欢喝牛奶,每天会喝k盒,如果手里的不够k盒,他就会把手里全部的牛奶都喝了。
众所周知,牛奶过期了之后肯定不能喝了,就只能扔掉。
现在冰箱中有n盒牛奶,超市中有m盒牛奶,如果冰箱中的牛奶喝不完就有浪费的情况出现,输出-1,否则输出能够在超市中购买的牛奶数量的最大值。
并且输出可以购买的牛奶的编号。
Input
第一行三个整数 n, m, k (1 ≤ n, m ≤ 106, 1 ≤ k ≤ n + m)
第二行 n 个整数 f1, f2, …, fn (0 ≤ fi ≤ 107) 表示冰箱里牛奶的剩余保质期。比如说,如果为0,就代表今天必须喝掉了,如果为1就代表明天必须喝掉。
第三行开始 m 个整数 s1, s2, …, sm (0 ≤ si ≤ 107) 超市牛奶的剩余保质期
Output
如果没有办法让ZhengRuCaiLaoBan喝完冰箱里的所有牛奶,输出 -1。
否则,在第一行输出ZhengRuCaiLaoBan如果一盒牛奶都不扔掉,最多购买超市中的几盒牛奶,设这个数量为 x 。 随后输出应该购买的牛奶的编号,编号按照输入顺序从 1 开始 1). 数字不应该被重复,但可以任意顺序。如果有多种可能的答案,可以输出任意一种。
Examples
样例输入1
3 6 2
1 0 1
2 0 2 0 0 2
样例输出1
3
1 2 3
样例输入2
3 1 2
0 0 0
1
样例输出2
-1
样例输入3
2 1 2
0 1
0
样例输出3
1
1
Note
在样例 1 中,ZhengRuCaiLaoBan可以考虑购买牛奶 1 2 3 ,其中 2 放在今天喝, 1 和 3 放在后天喝。
贪心+二分
H - 入
题面
ZhengRuCaiLaoBan有一个栈。此问题中的栈是支持两个操作的数据结构。操作push(x)将一个整数x放在栈的顶部,操作pop()从栈中删除顶部整数,即最后添加的整数。如果栈是空的,那么pop()操作什么也不做。
ZhengRuCaiLaoBan对栈进行了m次操作,但是忘记了这些操作。现在他想要回忆他的操作序列。他一个接一个地记起了这些操作,在第i步他记起了他做的第pi步操作。换句话说,他记得的运算顺序是p1 p2…pm。ZhengRuCaiLaoBan在执行了他已经记住的操作之后,按照相应的顺序,在每一步之后,他都想知道栈顶部的整数是多少。请你帮助他!
Input
第一行包含整数m(1≤m≤10^5)——ZhengRuCaiLaoBan执行的操作数。
接下来的m行包含ZhengRuCaiLaoBan记起来的操作。第i行两个整数pi和ti(1≤pi≤m, ti = 0或ti = 1)表示他记得第pi步的类型为ti。ti = 0表示操作是pop(),ti=1表示push(x)。如果操作是push(x),则该行中包含第三个整数xi(1≤xi≤10^6)表示添加到栈中的整数。保证从1到m的每一个整数恰好出现一次。
Output
输出m行每行一个整数。 第i行输出ZhengRuCaiLaoBan在执行了从1到i的步骤中记起的所有操作之后,栈顶部的数字。如果在执行所有这些操作之后栈是空的,那么输出-1。
Examples
样例输入1
2
2 1 2
1 0
样例输出1
2
2
样例输入2
3
1 1 2
2 1 3
3 0
样例输出2
2
3
2
样例输入3
5
5 0
4 0
3 1 1
2 1 1
1 1 2
样例输出3
-1
-1
-1
-1
2
Note
在第一个样例中,ZhengRuCaiLaoBan记住第一步的操作后,操作push(2)是唯一的操作,所以答案是2。当他记住在push(2)之前执行的pop()操作后,答案保持不变。 在第二个样例中,操作是push(2)、push(3)和pop()。 在第三个例子中,ZhengRuCaiLaoBan以相反的顺序记起操作。
线段树维护后缀
I - 骨
题面
ZhengRuCaiLaoBan非常喜欢红色,但他并不喜欢蓝色。 ZhengRuCaiLaoBan站在一个无垠的田野里,那里有n个红点和m个蓝点。 ZhengRuCaiLaoBanw希望在田野中绘制一个圆圈,使这个圆圈包含至少一个红点,而没有蓝点。恰好在圆的边界上的点可以被计算在内也可被计算在圆外。 请你计算满足这个条件的最大圆的半径。如果这个圆可以任意大,输出 -1。否则,你的答案将判为正确,当且仅当它与正确答案的相对或绝对误差不超过10^- 4。
Input
输入的第一行包含两个整数n, m(1≤n, m≤1,000)。
接下来的n行包含两个整数xi, yi(1≤xi, yi≤10^4)。表示一个红点的坐标。
接下来的m行包含两个整数xi, yi(1≤xi, yi≤10^4)。表示一个蓝点的坐标。
没有两个点有相同的坐标。
Output
如果这个圆可以任意大,那么输出-1,否则输出这个圆的最大半径。如果你与答案的绝对或相对误差不超过 10 - 4即被判为正确.
具体而言,假设你的答案是a 正确答案是 b. 那么你的答案会被判对当且仅当.
Examples
样例输入1
2 5
2 3
3 4
1 1
1 4
4 2
4 7
2 5
样例输出1
3.5355338827
样例输入2
1 6
3 3
1 5
5 4
2 1
3 4
4 2
1 3
样例输出2
1.5811388195
样例输入3
2 2
2 2
3 3
1 1
4 4
样例输出3
-1
Note
第一个样例的示意图:
第二个样例的示意图:
J - 相
题面
后缀数组模板+二分答案
K - 思
题面
这篇关于2019.8.7 金华正睿集训总结Day11(ACM)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!