Codeforces Round #598 (Div. 3)
Posted misuchii
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #598 (Div. 3)相关的知识,希望对你有一定的参考价值。
Codeforces Round #598 (Div. 3)
A. Payment Without Change
思路:水题 没开long long wa2(考场降智
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
ll q, a, b, n, s, x, y;
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> q;
while (q -- ){
cin >> a >> b >> n >> s;
if (a * n + b < s){
cout << "NO
";
continue;
}
x = s / n, y = s % n;
if (y <= b)
cout << "YES
";
else
cout << "NO
";
}
return 0;
}
B. Minimize the Permutation
思路:模拟
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 110;
int q, n;
int a[N], pos[N];
bool vis[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> q;
while (q -- ){
cin >> n;
memset(vis, false, sizeof(vis));
for (int i = 1; i <= n; i ++ ){
cin >> a[i];
pos[a[i]] = i;
}
for (int i = 1; i <= n; i ++ ){
for (int j = pos[i]; j >= 2; j -- ){
if (vis[j])
break;
if (a[j] > a[j - 1])
break;
swap(a[j], a[j - 1]);
swap(pos[a[j]], pos[a[j - 1]]);
vis[j] = true;
}
}
for (int i = 1; i < n; i ++ )
cout << a[i] << " ";
cout << a[n] << "
";
}
return 0;
}
C. Platforms Jumping
思路:考场降智 当时没想出来 赛后马上想出来了 疯狂改了条件就过了
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 1010;
int n, m, d, cnt;
int c[N], ans[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> d;
for (int i = 1; i <= m; i ++ ){
cin >> c[i];
cnt += c[i];
}
int left = n - cnt;
int div = left / (m + 1);
int mod = left % (m + 1);
if (mod)
div ++ ;
if (div >= d){
cout << "NO
";
return 0;
}
if (n - cnt <= m + 1){
int tmp = n - cnt, tot = 1;
for (int i = 1; i <= n; i ++ ){
if (tmp){
i ++ ;
tmp -- ;
}
for (int j = i; j < i + c[tot]; j ++ )
ans[j] = tot;
i += c[tot] - 1;
tot ++ ;
}
}
else{
int x = (n - cnt) / (m + 1), y = (n - cnt) % (m + 1), tot = 1;
for (int i = 1; i <= n; i ++ ){
if (y){
i ++ ;
y -- ;
}
i += x;
for (int j = i; j < i + c[tot]; j ++ )
ans[j] = tot;
i += c[tot] - 1;
tot ++ ;
}
}
cout << "YES
";
for (int i = 1; i < n; i ++ )
cout << ans[i] << " ";
cout << ans[n] << "
";
return 0;
}
D. Binary String Minimizing
思路:暴力 每次优先把0交换到最前面
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 1e6 + 10;
ll q, n, k, cnt1, tot;
ll cnt[N], pos[N];
string s;
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> q;
while (q -- ){
cin >> n >> k >> s;
cnt1 = 0, tot = 0;
for (int i = 0; i < n; i ++ ){
if (s[i] == '1')
cnt1 ++ ;
else{
cnt[tot] = cnt1;
pos[tot] = i;
tot ++ ;
}
}
for (int i = 0; i < tot; i ++ ){
if (cnt[i] <= k){
swap(s[pos[i]], s[pos[i] - cnt[i]]);
k -= cnt[i];
}
else{
swap(s[pos[i]], s[pos[i] - k]);
break;
}
}
cout << s << "
";
}
return 0;
}
F. Equalizing Two Strings
思路:如果两个串有不同的元素直接输出NO 如果有出现次数大于等于2的元素 直接输出YES 然后判断两个串的逆序数之和是否为偶数即可
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
int merge(char *str, char *ass, int beg, int mid, int end){
int cnt = 0;
int i = beg, j = mid + 1, k = beg;
while (i <= mid && j <= end){
if (str[i] > str[j]){
cnt += mid - i + 1;
ass[k ++ ] = str[j ++ ];
}
else
ass[k ++ ] = str[i ++ ];
}
while (i <= mid)
ass[k ++ ] = str[i ++ ];
while (j <= end)
ass[k ++ ] = str[j ++ ];
for (int l = beg; l < k; l ++ )
str[l] = ass[l];
return cnt;
}
int calc(char *str, char *ass, int beg, int end){
int cnt = 0;
if (end > beg){
int mid = (end + beg) / 2;
cnt += calc(str, ass, beg, mid);
cnt += calc(str, ass, mid + 1, end);
cnt += merge(str, ass, beg, mid, end);
}
return cnt;
}
const int N = 2e5 + 10;
int q, n;
char s[N], t[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> q;
while (q -- ){
cin >> n >> s >> t;
int cnt1[30] = {0}, cnt2[30] = {0};
for (int i = 0; i < n; i ++ ){
cnt1[s[i] - 'a'] ++ ;
cnt2[t[i] - 'a'] ++ ;
}
bool flag1 = true, flag2 = false;
for (int i = 0; i < 26; i ++ ){
if (cnt1[i] != cnt2[i]){
flag1 = false;
break;
}
}
if (!flag1){
cout << "NO
";
continue;
}
for (int i = 0; i < 26; i ++ ){
if (cnt1[i] >= 2 || cnt2[i] >= 2){
flag2 = true;
break;
}
}
if (flag2){
cout << "YES
";
continue;
}
char tmp1[N], tmp2[N];
int c1 = calc(s, tmp1, 0, n - 1), c2 = calc(t, tmp2, 0, n - 1);
if ((c1 + c2) % 2 == 0)
cout << "YES
";
else
cout << "NO
";
}
return 0;
}
以上是关于Codeforces Round #598 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #598 (Div. 3) D - Binary String Minimizing
Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp
Codeforces Round #598 (Div. 3) F Equalizing Two Strings(构造题)
Educational Codeforces Round 1