Codeforces Round 897 (Div. 2)

Codeforces Round 897 (Div. 2)

A. green_gold_dog, array and permutation

思路:
记录原数组中从大到小的值,并输出原数组对应的大小的值

#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int a[200010],b[200010];
int prime[N];
bool st[N];
mapmp;
struct node{
    int x,id;
    bool operator<(const node &w)const{
        return x>w.x;
    }
}tr[N];
void solve(){
    cin>>n;
    rep(i,1,n){
        int x;
        cin>>x;
        tr[i]={x,i};
    }
    sort(tr+1,tr+1+n);
    rep(i,1,n){
        b[tr[i].id]=i;
    }
    rep(i,1,n)cout<>t;
    while(t--)solve();
}

B. XOR PalindromesB. XOR Palindromes

思路:
我们可以发现,当如果里面对称位置不相等的时候那么一定会存在一个一,如果对应位置相等的话,那么可以是全为1也可以全为0,所以我们最少的一的次数就是不相等位置的次数,当将不相等位置都排完后,我们对应偶数位置才能输出1,因为,成对的位置相等,他们是一起的,你只能选全为1和全为0,最后就是奇数是特殊的,中间那个可以是1也可以是0,所以奇数中间就不用判断偶数位置还是奇数位置

#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int a[200010],b[200010];
int prime[N];
bool st[N];
mapmp;
struct node{
    int x,id;
    bool operator<(const node &w)const{
        return x>w.x;
    }
}tr[N];
void solve(){
    string s;
    cin >> n >> s;
    s = " " + s;
    int cnt = 0;
    for (int i = 1; i <= n / 2; i++)
        cnt += (s[i] != s[n - i + 1]);
    if (n & 1)
        for (int i = 0; i <= n; i++)
            if (i >= cnt && i <= n - cnt)
                cout << '1';
            else
                cout << '0';
    else
        for (int i = 0; i <= n; i++)
            if (i >= cnt && i <= n - cnt && (i - cnt) % 2 == 0)
                cout << '1';
            else
                cout << '0';
    cout << endl;
}
signed main(){
    cin>>t;
    while(t--)solve();
}

C. Salyg1n and the MEX Game

不会交互
给个大佬的

void solve()
{
    int n, x = 0, y;
    cin >> n;
    vector a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        if (a[i] == x)
            x++;
    while (1)
    {
        cout << x << endl;
        cout.flush();
        cin >> x;
        if (y == -1)
            break;
        x = y;
    }
}

D. Cyclic Operations

思路:
对位置和点权建边,跑强连通。
如果一个点位于单链上,分析可知一定可以完成赋值的,因为总存在一个点不需要对其他点负责,而且也可以多次对一个点覆盖。如果一个点位于强连通分量上,显然要大小等于 k

#include 

#define itn int
#define all(x) (x).begin(), (x).end()
#define make_unique(x) sort(all((x))); (x).resize(unique(all((x))) - (x).begin())

using namespace std;

inline int nxt() {
	int x;
	cin >> x;
	return x;
}

void solve() {
	int n = nxt(), k = nxt();
	vector a(n);
	for (int& x : a) {
		x = nxt() - 1;
	}
	if (k == 1) {
		for (int i = 0; i < n; ++i) {
			if (a[i] != i) {
				cout << "No\n";
				return;
			}
		}
		cout << "Yes\n";
		return;
	}
	vector used(n);
	for (int i = 0; i < n; ++i) {
		if (used[i]) {
			continue;
		}
		int v = i;
		while (!used[v]) {
			used[v] = 1;
			v = a[v];
		}
		if (used[v] == 1) {
			int cnt = 0;
			int u = v;
			do {
				++cnt;
				u = a[u];
			} while (u != v);
			if (cnt != k) {
				cout << "No\n";
				return;
			}
		}
		for (int v = i; used[v] != 2; v = a[v]) {
			used[v] = 2;
		}
	}
	cout << "Yes\n";
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int t = nxt();
	while (t--) {
		solve();
	}

	return 0;
}

你可能感兴趣的:(算法,图论)