ABC216

C

题意:给你一个数字N,一开始a = 0,看能不能通过+1(A)和*2(B)的操作使a = N,并且要求操作次数 <=120

#include<iostream>
#include<string>

using namespace std;

#define int long long

int n;
string s;

signed main(){
    cin >> n;
    while(n > 1){
        if(n & 1){
            s += "A";
            n --;
        }
        s += "B";
        n >>= 1;
    }
    
    s += "A";
    
    for(int i = s.size() - 1; i >= 0; i --) cout << s[i];
}

D

题意:总共2N个球,N种颜色,每一种颜色只有两个球,给你M个桶,每个桶从上到下放一列球,每次只能拿掉桶顶相同颜色的球,问能不能把所有桶里的球全拿完

方法:用平衡树,从1到M循环一遍,每次判断第i个桶的桶顶的球的颜色是否已经被插入到树里面,如果出现过,就dfs把重复的全部删掉,否则将这个球的颜色和i放到里面

#include<iostream>
#include<map>
#include<vector>

using namespace std;

const int N = 200010;

int n, m;
vector<int> v[N];
map<int, int> s;

void dfs(int x, int u){
    if(s.count(x) == 0){
        s[x] = u;
        return;
    }
    
    int idx = s[x];
    
    s.erase(s.find(x));
    v[idx].pop_back();
    v[u].pop_back();
    
    if(v[idx].size()) dfs(v[idx].back(), idx);
    if(v[u].size()) dfs(v[u].back(), u);
}

int main(){
    cin >> n >> m;
    
    n *= 2;
    for(int i = 0; i < m; i ++){
        int k;
        cin >> k;
        for(int j = 0; j < k; j ++){
            int a;
            cin >> a;
            v[i].push_back(a);
        }
    }
    
    for(int i = 0; i < m; i ++){
        if(s.count(v[i].back())){
            dfs(v[i].back(), i);
            continue;
        }
        
        if(v[i].size()) s[v[i].back()] = i;
    }
    
    if(s.size()) cout << "No" << endl;
    else cout << "Yes" << endl;
}
原文地址:https://www.cnblogs.com/tomori/p/15428395.html