SCAU2022春季个人排位赛第五场

Posted 晁棠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SCAU2022春季个人排位赛第五场相关的知识,希望对你有一定的参考价值。

SCAU2022春季个人排位赛第五场

写在开头

首先呢,A题是之前出过的题目,没有改,所以gg。

其次,这场打的时候觉得码量很大,但是之后补题的时候,发现其实一些状况可以合并,或者一路推演就会变成另一种状况,不用写太多的。

在训练期间,注意力还不够集中,虽然还是想关注隔壁蓝桥杯训练的状况,但确实影响了自己的注意力。

还需努力。

写题解才发现,今天有几题是一发A的,继续努力!

Problem C

原题Codeforces-883H

题解

统计落单的字母或数字有多少个,如果是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

原题Codeforces-883K

题解

这题,做的时候还有补题的时候,都在思考一个问题,就是判断的后效性。

就是我拿来比较的,必须是已经比较完的,之后不会修改的。如果先拿来比较,然后又修改,则之前的比较则是无效的。

回归这道题,先正着一遍扫到最小值,再反着一遍扫。最后判断是否合规,即可。

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

原题Gym - 102783F

题解

从二进制最高位开始枚举,如果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

原题Gym - 103373C

题解

我也不懂为什么,求个逆序对就完事。

代码

// 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春季个人排位赛第五场的主要内容,如果未能解决你的问题,请参考以下文章

SCAU2022春季个人排位赛第六场

SCAU2022春季个人排位赛第四场

SCAU2022春季个人排位赛第四场

SCAU2022春季个人排位赛第三场

SCAU2022春季个人排位赛第三场

SCAU2022春季个人排位赛第一场