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