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 ∣n∣−1 个9和 n n n 两个答案之中进行选择。
- n n n去除最后一位其余均为9,答案为 n n n
- 否则为 ∣ n ∣ − 1 |n|-1 ∣n∣−1 个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] [xi−ri,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 1≤T≤1000,−109≤x,y≤109,1≤r,d≤109
思路
将电磁炮方向转化为竖直向上:无论当前的电磁炮旋转角度如何,我们可以固定电磁炮的方向,将点 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° 0°−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 0−180 度,所以不需要分类讨论。
以 c o s cos cos 计算为例:
α = a r c c o s ( d i s − d r ) \\alpha = arccos(\\fracdis - dr) α=arccos(rdis−d)
β = 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 2≤n,m≤2×105,1≤k≤2×105,1≤q≤200
思路
每个人会挡住自己右边的人。每个人挡住的区域为一个折线右边的区域。
每次询问维护
m
n
[
i
]
,
X
以上是关于2022牛客多校1的主要内容,如果未能解决你的问题,请参考以下文章