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 - 思

题面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值