其他分享
首页 > 其他分享> > Codeforces Round #797 (Div. 3)

Codeforces Round #797 (Div. 3)

作者:互联网

比赛链接:

https://codeforces.com/contest/1690

F. Shifting String

题意:

给定一个字符串和一个置换集,每次字符串中的每个字符都变成对应位置的字符,问最少几次变化后(至少一次),字符串变回最初的形式。

思路:

字符串的总周期其实就是字符串中每个字符的周期的最小公倍数。所以先记录每个字符的总的变化,然后找到它的周期,求解即可。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
void solve(){
	LL n;
	cin >> n;
	vector <LL> a(n);
	string s;
	cin >> s;
	for (int i = 0; i < n; i ++ ){
		cin >> a[i];
		a[i] -- ;
	}
	LL ans = 1;
	vector <bool> vis(n, false);
	for (int i = 0; i < n; i ++ ){
		if (vis[i]) continue;
		string str = "";
		for (int j = i; !vis[j]; j = a[j]){
			vis[j] = true;
			str += s[j];
		}
		LL m = str.size(), k = m;
		for (int t = 1; t < m; t ++ ){
			if (m % t == 0){
				bool ok = true;
				for (int j = 0; j < m - t; j ++ ){
					if (str[j] != str[j + t]){
						ok = false;
						break;
					}
				}
				if (ok){
					k = t;
					break;
				}
			}
		}
		ans = lcm(ans, k);
	}
	cout << ans << "\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	LL T;
	cin >> T;
	while (T -- )
		solve();
	return 0;
}

G. Count the Trains

题意:

\(n\) 节车厢排成一排,每节车厢有一个初始速度 \(v_i\),都向左运动,当某节车厢的速度小于它左边的车厢的速度时,它的速度会变成前面车厢的速度,所有速度一样的车厢会变成一辆火车,现在有 \(m\) 个命令,每个命令会让第 \(k_i\) 节车厢的速度减去 \(d_i\),问命令下达后,火车有几辆。

思路:

对于第 \(i\) 节车厢,当 \(a_i > a_{i - 1}\) 时,会形成新的一辆火车,所以考虑储存下标,将满足条件的 \(i\),存到 \(map\) 中。
下达命令后修改的下标,如果它比前面的大,那么它肯定不会产生新的火车,所以可以直接删掉。否则依次向后删除比修改值大的序号,因为这些不会再形成火车了。

#include <bits/stdc++.h>
using namespace std;
void solve(){
	int n, m;
	cin >> n >> m;
	map <int, int> mp;
	function<void (int, int)> add = [&](int k, int d){
		mp[k] = d;
		auto it = mp.find(k);
		if (it != mp.begin() && prev(it) -> second <= d){
			mp.erase(it);
			return;
		}
		while(next(it) != mp.end() && d <= next(it) -> second){
			mp.erase(next(it));
		}
	};
	vector <int> a(n);
	for (int i = 0; i < n; i ++ ){
		cin >> a[i];
		add(i, a[i]);
	}
	for (int i = 0; i < m; i ++ ){
		int k, d;
		cin >> k >> d;
		k -- ;
		a[k] -= d;
		add(k, a[k]);
		cout << mp.size() << " \n"[i == m - 1];
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int T;
	cin >> T;
	while (T -- )
		solve();
	return 0;
}

标签:797,节车厢,int,Codeforces,cin,++,mp,str,Div
来源: https://www.cnblogs.com/Hamine/p/16411270.html