ICode9

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

Codeforces Round #797 (Div. 3)

2022-06-28 13:01:44  阅读:149  来源: 互联网

标签:797 节车厢 int Codeforces cin ++ mp str Div


比赛链接:

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

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

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

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

ICode9版权所有