Codeforces Round #842 (Div. 2) A~D

A - Greatest Convex

#include <bits/stdc++.h>
using namespace std;
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl 
typedef long long ll;
const int N = 1e7 + 10;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
ll T, n, m, k, x, y;
ll a[N];
char s[N];
char c;
void solve () {
    cin >> x;
    cout << x - 1 << endl;
}
int main() {
    ios::sync_with_stdio(false);
	cin.tie(nullptr);
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

B - Quick Sort

#include <bits/stdc++.h>
using namespace std;
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl 
typedef long long ll;
const int N = 1e7 + 10;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
ll T, n, m, k, x, y;
ll a[N];
char s[N];
char c;
void solve () {
		cin >> n >> k;
		for (int i = 0; i < n; i++) {
			cin >> a[i];
		}
		ll f = 1;
		for (int i = 0; i < n; i++) {
			if (a[i] == f) {
				f++;
			}
		}
		cout << (n - f + k) / k << endl;
	}
int main() {
    ios::sync_with_stdio(false);
	cin.tie(nullptr);
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

C - Elemental Decompress

#include <bits/stdc++.h>
using namespace std;
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl 
typedef long long ll;
const int N = 1e7 + 10;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
ll T, n, m, k, x, y;
ll a[N];
char s[N];
char c;
void solve () {
    int n;
    cin >> n;
    int a[n + 2];
    vector <int> idx[n + 2];
    int cnt[n + 2];
    memset(cnt, 0, sizeof cnt);
    int p[n + 2], q[n + 2];
    for (int i = 1; i <= n; i++) {
    	cin >> a[i];
    	cnt[a[i]]++;
    	idx[a[i]].push_back(i);
    }
    bool f = 1;
    int vlup = 1, vluq = 1;
    unordered_map <int, int> markp, markq;
    for (int i = 1; i <= n; i++) {
    	if (!cnt[i]) continue;
    	while (markp[vlup]) 
            vlup++;
    	while (markq[vluq]) 
            vluq++;
    	if (vlup > n || vluq > n) {
    		f = 0; break;
    	}
    	if (cnt[i] == 1) {
    		p[idx[i][0]] = i;
    		q[idx[i][0]] = i;
    		markp[i] = 1;
    		markq[i] = 1;
    	}
    	else if (cnt[i] == 2) {
			if (vlup >= i && vluq >= i) {
				f = 0; break;
   			}
   			markp[i] = 1, markq[vluq] = 1;
   			p[idx[i][0]] = i;
   			q[idx[i][0]] = vluq++;
   			markp[vlup] = 1, markq[i] = 1;
   			p[idx[i][1]] = vlup++;
   			q[idx[i][1]] = i;
   		}
   		else {
   			f = 0; break;
   		}
   	}
   	if (f) {
   		cout << "YES\n";
   		for (int i = 1; i <= n; i++) {
   			cout << p[i] << ' ';
   		}
   		cout << '\n';
   		for (int i = 1; i <= n; i++) {
   			cout << q[i] << ' ';
   		}
   		cout << '\n';
   	}
   	else cout << "NO\n";
}
    

int main() {
    ios::sync_with_stdio(false);
	cin.tie(nullptr);
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

D - Lucky Permutation

#include <bits/stdc++.h>
using namespace std;
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << std::endl 
typedef long long ll;
const int N = 1e7 + 10;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
ll T, n, m, k, x, y;
ll a[N], f[N], w[N];
char s[N];
char c;
int find (int x)
{
	if (x == f[x]) {
        return x;
    }
	return f[x] = find (f[x]);
}
void solve () {
    cin >> n;
	for (int i = 1; i <= n; i++) {
        f[i] = i, w[i] = 1;
    }
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
		int t1 = find (a[i]), t2 = find (i);
		if (t1 != t2) {
			f[t1] = t2;
			w[t2] += w[t1];
		}
	}
	bool f2 = 0;
	for (int i = 1; i < n; i++) {
		if (find (i) == find (i+1)) 
            f2=1;
    }
	int cnt = 0;
	for (int i = 1; i <= n; i++){
		if (f[i] == i && w[i] >= 2)
			cnt += w[i] - 1;
	}
	if(f2) 
        cout << cnt - 1 << endl;
	else   
        cout << cnt + 1 << endl;
}
int main() {
    ios::sync_with_stdio(false);
	cin.tie(nullptr);
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值