SCAU2022春季个人排位赛第五场
Posted 晁棠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SCAU2022春季个人排位赛第五场相关的知识,希望对你有一定的参考价值。
SCAU2022春季个人排位赛第五场
写在开头
首先呢,A题是之前出过的题目,没有改,所以gg。
其次,这场打的时候觉得码量很大,但是之后补题的时候,发现其实一些状况可以合并,或者一路推演就会变成另一种状况,不用写太多的。
在训练期间,注意力还不够集中,虽然还是想关注隔壁蓝桥杯训练的状况,但确实影响了自己的注意力。
还需努力。
写题解才发现,今天有几题是一发A的,继续努力!
Problem C
题解
统计落单的字母或数字有多少个,如果是1个或者0个,那么最终答案只需要1个字符串即可。
如果不行,最后的字符串的长度必须是奇数。并且最少的字符串个数为落单的个数。
但是也有可能组成不了奇数长度的字符串集。那么此时只需要从偶数个的字母里拿出2个过来当做落单的即可。也就是要要多2个字符串。这个判断可以反复做,知道能够组成奇数长度字符串为止。因为这样子最后的结果便是每个字符串长度为1。
代码
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
const int N = 4e5 + 10;
int n, T;
string c;
map<char, int> mp;
vector<char> ji;
vector<char> ou;
int lenji, lenou;
void ready()
IOS;
cin >> n;
cin >> c;
ffor(i, 0, n - 1)
mp[c[i]]++;
for (auto item : mp)
if (item.second % 2)
ji.push_back(item.first);
for (int i = 1; i * 2 < item.second; i++)
ou.push_back(item.first);
else
for (int i = 1; i * 2<= item.second; i++)
ou.push_back(item.first);
lenji = ji.size();
lenou = ou.size();
void work()
if (lenji<=1)
cout << 1 << '\\n';
int cnt = 1;
stack<char> s;
for (auto item : ou)
cout << item;
s.push(item);
if (lenji) cout << ji[0];
while (s.size())
cout << s.top();
s.pop();
return;
while (n % lenji || n / lenji % 2 == 0)
ji.push_back(ou[lenou - 1]);
ji.push_back(ou[lenou - 1]);
ou.pop_back();
lenou = ou.size();
lenji = ji.size();
cout << lenji << '\\n';
int len = n / lenji,oi=0;
for (auto mid : ji)
stack<char> s;
for (int i = 1; i <= len / 2; i++)
cout << ou[oi];
s.push(ou[oi]);
oi++;
cout << mid;
while (s.size())
cout << s.top();
s.pop();
cout << ' ';
signed main()
ready();
work();
return 0;
Problem D
题解
这题,做的时候还有补题的时候,都在思考一个问题,就是判断的后效性。
就是我拿来比较的,必须是已经比较完的,之后不会修改的。如果先拿来比较,然后又修改,则之前的比较则是无效的。
回归这道题,先正着一遍扫到最小值,再反着一遍扫。最后判断是否合规,即可。
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n, T;
int s[N], g[N], f[N];
void ready()
cin >> n;
ffor(i, 1, n) cin >> s[i] >> g[i];
ffor(i, 1, n) f[i] = s[i] + g[i];
void work()
int ans = 0;
ffor(i, 2, n) f[i] = min(f[i], f[i - 1] + 1);
rrep(i, n - 1, 1) f[i] = min(f[i], f[i + 1] + 1);
ffor(i,1,n)
if (f[i] < s[i])
cout << -1;
return;
ans += f[i] - s[i];
cout << ans << '\\n';
ffor(i, 1, n) cout << f[i] << ' ';
signed main()
ready();
work();
return 0;
Problem E
原题[Gym - 103562D](https://codeforces.com/gym/103562/problem/D)
题解
记录每一个点与 ( 0 , 0 ) (0,0) (0,0)相连,与x轴正方向的角度。若要用两条边覆盖所有的点,那么这两个点的边必需相邻。然后再特判一下最大和最小即可。
代码
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
const double pi = 3.14159265;
const int N = 1e5 + 10;
int n, T;
double a[N];
void ready()
//IOS;
cin >> n;
double doit(double a, double b, double c, double d)
double res = (a * d - b * c) / (sqrt(a * a + b * b) * sqrt(c * c + d * d));
res = asin(res) / pi * 180.0;
return res;
void work()
double maxn = 0, minn = 1000;
ffor(i, 1, n)
double x, y;
cin >> x >> y;
double ang;
if (x == 0 && y == 0) ang = 0.0;
else if (x == 0 && y > 0) ang = 90.0;
else if (x == 0 && y < 0) ang = 270.0;
else if (y == 0 && x > 0) ang = 0.0;
else if (y == 0 && x < 0) ang = 180.0;
else if (x > 0 && y > 0) ang = doit(1.0, 0.0, x, y) ;
else if (x > 0 && y < 0) ang = 360 + doit(1.0, 0.0, x, y) ;
else if (x < 0 && y > 0) ang = doit(-1.0, 0.0, x, y) + 180;
else if (x < 0 && y < 0) ang = doit(-1.0, 0.0, x, y) + 180;
//printf("%.10lf\\n", ang);
a[i] = ang;
double ans = 100000.0;
sort(a + 1, a + n + 1);
if (n == 1) ans = 0;
else if (n == 2) ans = abs(a[1] - a[2]);
else
ffor(i, 1, n - 1)
ans = min(ans, 360 - abs(a[i] - a[i + 1]));
//cout << a[i] << ' '<< a[i+1] << '\\n';
ans = min(ans, a[n] - a[1]);
printf("%.10lf", ans);
signed main()
ready();
work();
return 0;
Problem F
题解
从二进制最高位开始枚举,如果a在该位为0,另一个数在这一位或1任然小于b,则这一位可以为1。
代码
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
int n, T;
int a, b;
void ready()
IOS;
cin >> a >> b;
if (a < b) swap(a, b);
void work()
int res = 0;
rrep(i, 60, 0)
int ai = (a >> i);
if ((ai & 1) == 0)
int bi = (1ll << i);
if ((res | bi) <= b)
//cout << bi << '\\n';
res = res | bi;
//cout << "res=" << res << '\\n';
cout << (a ^ res);
signed main()
ready();
work();
return 0;
Problem G
题解
我也不懂为什么,求个逆序对就完事。
代码
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
const int N = 200005;
int n, T;
int t[N];
int c[N];
int lowbite(int x)
return x & (-x);
void add_in(int i)
while (i <= n)
t[以上是关于SCAU2022春季个人排位赛第五场的主要内容,如果未能解决你的问题,请参考以下文章