2022牛客多校1

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022牛客多校1相关的知识,希望对你有一定的参考价值。

2022牛客多校1补题

更好观感

题解有A C D G I J六题。

题解纯属自己玩,更多详细解释还请看官方题解。

G

题意

给定 n n n ,将 1 , 2 , . . . , n 1,2,. . . , n 1,2,...,n 视为不含前导零的字符串

求这些字符串中字典序最大的字符串

思路

只需要在 ∣ n ∣ − 1 |n|-1 n1 个9和 n n n 两个答案之中进行选择。

  • n n n去除最后一位其余均为9,答案为 n n n
  • 否则为 ∣ n ∣ − 1 |n|-1 n1 个9

复杂度 : O ( ∣ n ∣ ) O(|n|) O(n)

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using arr = array<int, 3>;
using vi = vector<int>;
using vl = vector<ll>;
const int N = 1e5 + 5, M = N;
const int mod = 1e9 + 7;

void solve()

	string s;
	cin >> s;
	string t = string(s.size() - 1, '9');
	if(s.substr(0, s.size() - 1) == t) cout << s << "\\n";
	else cout << t << "\\n";

int main()

	ios::sync_with_stdio(false);
	cin.tie(0);

	int t;
	t = 1;
	// cin >> t;
	while(t--)
		solve();
	return 0;

A

题意

n n n个区间 [ x i − r i , x i + r i ] [x_i-r_i, x_i+r_i] [xiri,xi+ri] ,求 n n n 个区间并之后的区间的空隙长度和。

思路

贪心,将区间按左端点从小到大排序,从前往后扫一遍,不断维护维护区间右端点 r r r 。若当前区间的左端点小于 r r r ,可以进行合并,并且更新区间右端点;若当前区间的左端点大于 r r r ,计算答案。

注意第一个区间的判断以及 r r r 的初始值。

复杂度 : O ( n l o g n ) O(nlogn) O(nlogn)

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using arr = array<int, 3>;
using vi = vector<int>;
using vl = vector<ll>;
const int N = 1e5 + 5, M = N;
const int mod = 1e9 + 7;
void solve()

	int n;
	cin >> n;
	vector<pii> a(n);
	for(int i = 0; i < n; i++)
	
		int c, r;
		cin >> c >> r;
		a[i] = c - r, c + r;
	
	sort(a.begin(), a.end());
	ll ans = 0, rr = -1e18;
	for(int i = 0; i < n; i++)
	
		ll l = a[i].first, r = a[i].second;
		if(l > rr && i)
			ans += (l - rr);
		rr = max(rr, r);
	
	cout << ans << "\\n";

int main()

	ios::sync_with_stdio(false);
	cin.tie(0);

	int t;
	t = 1;
	// cin >> t;
	while(t--)
		solve();
	return 0;

D

题意

给定一个圆和严格位于圆内的一点 P P P

Mocha 会从点 P P P 向任意角度发射一个长度为 2 d 2d 2d 的电磁炮

电磁炮底边的中点为点P且两端位于圆内

询问单次发射能摧毁的最大圆弧长

1 ≤ T ≤ 1000 , − 1 0 9 ≤ x , y ≤ 1 0 9 , 1 ≤ r , d ≤ 1 0 9 1≤T≤1000,-10^9≤ x, y ≤10^9,1 ≤r, d≤10^9 1T1000,109x,y109,1r,d109

思路

将电磁炮方向转化为竖直向上:无论当前的电磁炮旋转角度如何,我们可以固定电磁炮的方向,将点 P P P 绕原点旋转,从而使得电磁炮方向竖直向上(即 y y y 轴正方向)。

那么可以将题目转化成为电磁炮的方向总是竖直向上的,点 P 绕原点旋转一周的过程中可以摧毁的最长墙壁长度。

那么我们设点 P 到原点距离是 d i s dis dis,点 Q 绕原点旋转一周就可以转化成点Q在以 ( − d i s , 0 ) (-dis,0) (dis,0) ( d i s , 0 ) (dis,0) (dis,0) 为端点的线段上移动。

下面用一张动图来说明:当点 Q 位于 x x x 轴上时,产生的弧长最长。

所以画图进行计算,我们计算弧度以此来算弧长。 L = α R L = \\alpha R L=αR

当我们使用 s i n sin sin 计算时,因为正弦的 0 ° − 180 ° 0°-180° 180°表示并不唯一,所以需要分情况讨论 d i s > d dis > d dis>d d i s < d dis < d dis<d

当我们使用 c o s cos cos 计算时, c o s cos cos 可以唯一表示 0 − 180 0-180 0180 度,所以不需要分类讨论。

c o s cos cos 计算为例:

α = a r c c o s ( d i s − d r ) \\alpha = arccos(\\fracdis - dr) α=arccos(rdisd)

β = a r c o s ( d i s + d r ) \\beta = arcos(\\fracdis + dr) β=arcos(rdis+d)

L = ( α − β ) × r L = (\\alpha - \\beta) \\times r L=(αβ)×r

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using arr = array<int, 3>;
using vi = vector<int>;
using vl = vector<ll>;
const int N = 1e5 + 5, M = N;
const int mod = 1e9 + 7;

void solve()

	int r, x, y, d;
	cin >> r >> x >> y >> d;

	double dis = sqrt(1ll * x * x + 1ll * y * y);

	cout << fixed << setprecision(12);
	double a = acos((dis + d) / r);
	double b = acos((dis - d) / r);
	cout << (b - a) * r << "\\n";
	// if(dis > d)
	// 
	// 	double a = asin((dis + d) / r);
	// 	double b = asin((dis - d) / r);
	// 	cout << r * (a - b) << "\\n";
	// 
	// else
	// 
	// 	double a = asin((d + dis) / r);
	// 	double b = asin((d - dis) / r);
	// 	cout << r * (a + b) << "\\n";
	// 

int main()

	ios::sync_with_stdio(false);
	cin.tie(0);

	int t;
	t = 1;
	cin >> t;
	while(t--)
		solve();
	return 0;

C

题意

一个二维平面,黑板为 ( 0 , 1 ) − ( 0 , m ) (0,1)-(0,m) (0,1)(0,m) 的线段, n n n m m m 列座位在黑板前面,均为整数坐标。

k k k 个位置有人,求到黑板视线不被任何人挡住的座位数量。

q q q 次询问,修改一个人的坐标要求计算答案。

2 ≤ n , m ≤ 2 × 1 0 5 , 1 ≤ k ≤ 2 × 1 0 5 , 1 ≤ q ≤ 200 2 \\leq n,m \\leq 2\\times10^5, 1 \\leq k \\leq 2 \\times10 ^ 5, 1 \\leq q \\leq 200 2n,m2×105,1k2×105,1q200

思路

每个人会挡住自己右边的人。每个人挡住的区域为一个折线右边的区域。

每次询问维护 m n [ i ] , X

以上是关于2022牛客多校1的主要内容,如果未能解决你的问题,请参考以下文章

2022牛客多校第一场ACDGIJ

2022 牛客多校 第四场 C

2022牛客多校1

2022牛客多校1

2022牛客多校1

2022牛客多校1