ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022牛客多校(一)

2022-07-20 13:02:40  阅读:120  来源: 互联网

标签:return int auto 多校 牛客 2022 out id define


A

线段覆盖,求未覆盖长度

左端点排序,然后扫一遍

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define endl  "\n"
 5 #define mp    make_pair
 6 #define pb    push_back
 7 #define st    first
 8 #define nd    second
 9 #define pii   pair<int, int>
10 
11 #define sz(x) (int((x).size())
12 #define rep(i, s, t) for (int i = (int)(s); i <= (int)(t); ++ i)
13 #define inc(i, s, t) for (int i = (int)(s); i <  (int)(t); ++ i)
14 
15 typedef long long ll;
16 typedef long double ld;
17 typedef unsigned long long ull;
18 
19 #ifdef LOCAL
20 ostream &operator<<(ostream &out, string str) {
21     for (char c : str)
22         out << c;
23     return out;
24 }
25 template <class L, class R> ostream &operator<<(ostream &out, pair<L, R> p) { return out << "(" << p.st << ", " << p.nd << ")"; }
26 template <class L, class R, class S> ostream &operator<<(ostream &out, tuple<L, R, S> p) {
27     auto &[a, b, c] = p;
28     return out << "(" << a << ", " << b << ", " << c << ")";
29 }
30 template <class T> auto operator<<(ostream &out, T a) -> decltype(a.begin(), out) {
31     out << '{';
32     for (auto it = a.begin(); it != a.end(); it = next(it))
33         out << (it != a.begin() ? ", " : "") << *it;
34     return out << '}';
35 }
36 void dump() { cerr << "\n"; }
37 template <class T, class... Ts> void dump(T a, Ts... x) {
38     cerr << a << ", ";
39     dump(x...);
40 }
41 #define debug(...) cerr << "[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__)
42 #else
43 #define debug(...) ;
44 #endif
45 
46 const int N = 2e5 + 10;
47 #define int long long
48 struct Node {
49     int x, r;
50     bool operator < (const Node& rhs) const {
51         if (x == rhs.x) return x + r < rhs.x + rhs.r;
52         return x < rhs.x;
53     }
54 } a[N];
55 
56 int32_t main() {
57     int n; cin >> n;
58     rep(i, 1, n) cin >> a[i].x >> a[i].r;
59     sort(a + 1, a + n + 1);
60     ll ans = 0, id = 1;
61     rep(i, 2, n) {
62         debug(id);
63         debug(a[id].x, a[id].r);
64         if (a[id].x + a[id].r >= a[i].x - a[i].r) {
65             if (a[i].x + a[i].r > a[id].x + a[id].r)
66                 id = i;
67         } else {
68             ans += a[i].x - a[i].r - (a[id].x + a[id].r);
69             id = i;
70         }
71     }
72     cout << ans << endl;
73 }
View Code

 

D

结论题,考虑如何能得到最大圆弧

那么发现当旋转的线段所在的直线过圆心时,圆弧上的曲率最大

相同长度上的圆弧,曲率越大,圆弧越长

所以直接算出直线过原点的情况即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 double r;
 4 double x,y,d;
 5 int main(){
 6     int T;scanf("%d",&T);
 7     while(T--){
 8         cin>>r>>x>>y>>d;
 9         double D=sqrt(x*x+y*y);
10         double a=asin((d+D)/r),b=asin((d-D)/r);
11         printf("%.12lf\n",a*r+b*r);
12     }    
13     return 0;
14 }
View Code

 

G

签到题

题意就是给一堆区间把所有相交的区间合并,

找出合并后,所有区间后的空隙

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LOCAL
 4  
 5 #define endl  "\n"
 6 #define mp    make_pair
 7 #define pb    push_back
 8 #define st    first
 9 #define nd    second
10 #define pii   pair<int, int>
11  
12 #define sz(x) (int((x).size())
13 #define rep(i, s, t) for (int i = int(s); i <= int(t); ++ i)
14 #define inc(i, s, t) for (int i = int(s); i <  int(t); ++ i)
15  
16 typedef long long ll;
17 typedef long double ld;
18 typedef unsigned long long ull;
19  
20 #ifdef LOCAL
21 ostream &operator<<(ostream &out, string str) {
22    for (char c : str)
23       out << c;
24    return out;
25 }
26 template <class L, class R> ostream &operator<<(ostream &out, pair<L, R> p) { return out << "(" << p.st << ", " << p.nd << ")"; }
27 template <class L, class R, class S> ostream &operator<<(ostream &out, tuple<L, R, S> p) {
28    auto &[a, b, c] = p;
29    return out << "(" << a << ", " << b << ", " << c << ")";
30 }
31 template <class T> auto operator<<(ostream &out, T a) -> decltype(a.begin(), out) {
32    out << '{';
33    for (auto it = a.begin(); it != a.end(); it = next(it))
34       out << (it != a.begin() ? ", " : "") << *it;
35    return out << '}';
36 }
37 void dump() { cerr << "\n"; }
38 template <class T, class... Ts> void dump(T a, Ts... x) {
39    cerr << a << ", ";
40    dump(x...);
41 }
42 #define debug(...) cerr << "[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__)
43 #else
44 #define debug(...) ;
45 #endif
46  
47 int32_t main() {
48   string s;
49   cin >> s;
50   int n = s.length();
51   if (n == 1) cout << s;
52   else {
53     bool flag = true;
54     inc(i, 0, n - 1) if (s[i] != '9') flag = false;
55     if (flag) cout << s;
56     else {
57       inc(i, 0, n - 1) printf("9");
58     }
59   }
60 }
View Code

 

I

定义dp[i][j]为抽取i次牌后剩余j张单牌的概率

转移方程写为

1 dp[0][cnt]=1;
2 for(int i=1;i<=121;++i)
3     for(int j=1;j<=13;j+=2)
4         dp[i][j]=dp[i-1][j]*(124-i-3*j)*inv(124-i)+dp[i-1][j+2]*(3*j+6)*inv(124-i);

最终答案的求和

1 int ans=0;
2 for(int i=0;i<=121;++i)
3     ans=ans+i*dp[i-1][1]*3*inv(124-i);

 

J

启发式合并

题意是求出一个图中染色的最大点数

考虑通过边的关系将x和y进行合并,边是单向的,

有结论如果选择x能将y染色,那么选择x一定是更优的

根据这一特点建树,求出森林中最大size的树即可

 1 set<int>to[N], from[N];
 2 int fa[N], sz[N];
 3 int findf(int x) {
 4     if (fa[x] == x)return x;
 5     return fa[x] = findf(fa[x]);
 6 }
 7 void _Merge(int x, int y) {
 8     x = findf(x), y = findf(y);
 9     if (x == y)return;
10     if (to[x].size() < to[y].size())
11         swap(x, y);
12     fa[y] = x;
13     sz[x] += sz[y];
14     vector<pair<int, int> >mg;
15     for (auto t : to[y]) {
16         to[x].insert(t);
17         from[t].erase(y);
18         from[t].insert(x);
19         if (from[t].size() == 1)
20             mg.push_back(make_pair(t, x));
21     }
22     for (auto [x, y] : mg)
23         _Merge(x, y);
24 }
25 
26 int main() {
27     int T = fast_IO::read();
28     for (int ti = 1; ti <= T; ++ti) {
29         int n = fast_IO::read();
30         for (int i = 1; i <= n; ++i)fa[i] = i, sz[i] = 1;
31         for (int i = 1; i <= n; ++i) {
32             int k = fast_IO::read();
33             for (int j = 1; j <= k; ++j) {
34                 int y = fast_IO::read();
35                 to[y].insert(i);
36                 from[i].insert(y);
37             }
38         }
39         for (int i = 1; i <= n; ++i)
40             if (from[i].size() == 1)
41                 _Merge(*from[i].begin(), i);
42         int ans = 0;
43         for (int i = 1; i <= n; ++i)
44             ans = max(ans, sz[i]);
45         printf("Case #%d: %d\n", ti, ans);
46         for (int i = 1; i <= n; ++i)
47             to[i].clear(), from[i].clear();
48     }
49     return 0;
50 }
View Code

 

 

 

 

 

标签:return,int,auto,多校,牛客,2022,out,id,define
来源: https://www.cnblogs.com/2018hzoicyf/p/16497573.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有