冬训周报(二)

一、天梯训练赛

L2-1 插松枝

模拟题:有一个推送器和一个盒子,推送器会给出松针片,松针下面的片一定要比上面的大,看能组合成一些什么样的松针

感觉没什么特别的地方,模拟就行了,但是赛时写拉了,只拿了19分

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

void solve(){
    int n ,m ,k;
    cin >> n >> m >> k;
    queue q;
    stack s;
    for (int i = 0; i < n; i ++ ){
        int x;
        cin >> x;
        q.push(x);
    }
    while(1){
        vector v;
        bool ok = 0;
        while(1){
            if (v.empty()){
                if (!s.empty()){
                    v.push_back(s.top());
                    s.pop();
                }else if (!q.empty()){
                    v.push_back(q.front());
                    q.pop();
                }else break;
            }else{
                if (!s.empty() and s.top() <= v.back()){
                    v.push_back(s.top());
                    s.pop();
                }else{
                    while (!q.empty() and s.size() <= m){
                        auto t = q.front();
                        if (t <= v.back()){
                            q.pop();
                            v.push_back(t);
                            break;
                        }else{
                            if (s.size() == m){
                                ok = 1;
                                break;
                            }else{
                                s.push(t);
                                q.pop();
                            }
                        }
                    }
                    if (q.empty() and (s.empty() or s.top() > v.back())) break;

                }
            }
            if (ok or v.size() == k) break;
        }
        for (int i = 0 ; i < v.size() ; i ++){
            if (i != v.size() - 1){
                cout << v[i] << ' ';
            }else{
                cout << v[i] << endl;
            }
        }
        if(s.empty() && q.empty()) break;
    }
}
signed main(){
    IOS
    int O_O = 1;
//    cin >> O_O;
    while(O_O--) solve();
}

L2-3 龙龙送外卖

给出一棵树,这是龙龙送外卖的路径,每条路的长度为1,现在要在原有的点多送一份外卖,看最短距离为多少 ,我的思路是先算出每个点的深度,然后对于新增的点他所走的所有路径之和,然后减去最大深度就是答案

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

vector g[N];
int d[N];
bool vis[N];
void dfs(int u){
    for(auto v:g[u]){
        d[v] = d[u] + 1;
        dfs(v);
    }
}
void solve(){
    int n ,m ,j;
    cin >> n >> m;
    vector a(n + 1);
    for(int i = 1 ; i <= n ; i++){
        cin >> a[i];
        if(a[i] == -1) j = i;
        else g[a[i]].push_back(i);
    }
    dfs(j);
    int dis = 0 ,mx = 0;
    while(m--){
        int x;
        cin >> x;
        mx = max(mx ,d[x]);
        while(!vis[x] and x != j){
            vis[x] = 1;
            dis += 2;
            x = a[x];
        }
        cout << dis - mx << endl;
    }
}
signed main(){
    IOS
    int O_O = 1;
//    cin >> O_O;
    while(O_O--) solve();
}

二、 SMU winter 2025 Personal Round 2

Problem - A - Codeforces

直接输出b c c

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int a ,b ,c ,d;
    cin >> a >> b >> c >> d;
    cout << b << " " << c << " " << c << endl;

}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

Problem - B - Codeforces

模拟,一直除二加十直到减十操作能满足

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int x ,n ,m;
    cin >> x >> n >> m;
    if(m * 10 >= x){
        cout << "YES" << endl;
        return;
    }
    while(n > 0){
        x = x / 2 + 10;
        if(m * 10 >= x){
            cout << "YES" << endl;
            return;
        }
        n--;
    }
    if(m * 10 >= x){
        cout << "YES" << endl;
        return;
    }
    cout << "NO" << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

 Problem - C - Codeforces

试了很多种结果,最后发现就是深度减子树数量最大的前k个

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

vector g[N];
bool vis[N];
int d[N] ,chi[N];
priority_queue q;
int dfs(int u){
    vis[u] = 1;
    chi[u] = 1;
    for(auto x : g[u]){
        if(x == 1 or vis[x]) continue;
        vis[x] = 1;
        d[x] = d[u] + 1;
        chi[u] += dfs(x);
    }
    q.push(d[u] - chi[u] + 1);
    return chi[u];
}
void solve(){
    int n ,k;
    cin >> n >> k;
    for(int i = 1 ; i < n ; i++) {
        int u ,v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1);
    int ans = 0 ,num = 0;
//    for(int i = 1 ; i <= n ; i++){
//        cout << i << " : " << d[i] << " " << chi[i] << endl;
//    }
    for(int i = 1 ; i <= k ; i++){
        ans+=q.top();
        q.pop();
    }
    cout << ans << endl;
}
signed main(){
    IOS
    int O_O = 1;
//    cin >> O_O;
    while(O_O--) solve();
}

Problem - D - Codeforces、

固定一个值然后二分查找满足条件的,不过r g b 之间的优先级是看题解才知道的

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

int ans = LLONG_MAX;
int cal(int x){return x * x;}
void check(vector a ,vector b ,vector c){
    for(auto x : a){
        auto u = lower_bound(b.begin(),b.end(),x);
        auto v = upper_bound(c.begin(),c.end(),x);
        if(u == b.end() or v == c.begin()) continue;
        v--;
        ans = min(ans ,cal(x - *u) + cal(*u - *v) + cal(*v - x));
    }
}
void solve(){
    int nr ,ng ,nb;
    cin >> nr >> ng >> nb;
    vector r(nr) ,g(ng),b(nb);
    for(int i = 0 ; i < nr ; i++) cin >> r[i];
    for(int i = 0 ; i < ng ; i++) cin >> g[i];
    for(int i = 0 ; i < nb ; i++) cin >> b[i];
    sort(r.begin(),r.end());
    sort(g.begin(),g.end());
    sort(b.begin(),b.end());
    ans = LLONG_MAX;
    check(r, g, b); check(r, b, g);
    check(g, b, r); check(g, r, b);
    check(b, r, g); check(b, g, r);
    cout << ans << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

三、牛客寒假训练营四

 K-Tokitsukaze and Shawarma

按照题意输出答案即可

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

void solve(){
    int x ,y ,z ,a ,b ,c;
    cin >> x >> y >> z >> a >> b >> c;
    cout << max(max(x * a , y * b) , c * z) << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

I-Tokitsukaze and Pajama Party

贪心

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

void solve(){
    int n;
    cin >> n;
    string s;
    cin >> s;
    int ans = 0 ,num = 0 ,cnt = 0;
    for(int i = 0 ; i < n ; i++){
        string c = s.substr(i,8);
        if(i <= n - 7 and c == "uwawauwa" and cnt and num){
            ans += cnt;
            if(s[i - 1] == 'u') ans--;
        }
        if(cnt) num++;
        if(s[i] == 'u') cnt++;
        if(i == n - 7) break;
    }
    cout << ans << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

E-Tokitsukaze and Dragon's Breath

求出往左下后和右下两个方向的前缀和,然后对于每个点加上两个前缀和减去本身的值取最大值

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

int mp[1005][1005];

void solve(){
    int n ,m;
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i++){
        for(int j = 1 ; j <= m ; j++){
            cin >> mp[i][j];
        }
    }
    vector> sum1(n + 2,vector(m + 2 ,0));
    vector> sum2(n + 2,vector(m + 2 ,0));
    for (int i = 1 ; i <= n ; i++){
        for (int j = 1 ; j <= m ; j++) {
            if(i > 1 and j > 1) sum1[i][j] = mp[i][j] + sum1[i - 1][j - 1];
            else sum1[i][j] = mp[i][j];
        }
    }
    for (int i = 1 ; i <= n ; i++){
        for (int j = 1 ; j <= m ; j++){
            if(i > 1 and j < m) sum2[i][j] = mp[i][j] + sum2[i - 1][j + 1];
            else sum2[i][j] = mp[i][j];
        }
    }
    int ans = 0;
    for (int i = 1 ; i <= n ; i++){
        for (int j = 1 ; j <= m ; j++){
            int res = 0 ,y = j - 1 ,x = i + y;
            if(x > n){
                x = n - i;
                y = max(1ll,j - x);
                res += sum2[n][y];
            }else res += sum2[x][1];
            y = m - j , x = i + y;
            if(x > n){
                x = n - i;
                y = min(j + x,m);
                res += sum1[n][y];
            }else res += sum1[x][m];
            res -= mp[i][j];
            ans = max(ans ,res);
        }
    }
    cout << ans << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

B-Tokitsukaze and Balance String (easy)

easy版的可以用二进制枚举暴力解决,但是我一开始是直接在找规律,发现对于每个字符串,只要前后两个字符相同,贡献就是n - 2 ,不同就是2,但是前几发判断条件写的有点问题,后面用二进制枚举解决的

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int n;
    cin >> n;
    string s;
    cin >> s;
    int z = 0;
    vector idx;
    for(int i = 0 ; i < n ; i++) if(s[i] == '?') z++ ,idx.push_back(i);
    int ans = 0;
    for(int i = 0 ; i < (1 << z) ; i++){
        string c = s;
        for(int j = 0 ; j < z ; j++){
            if(i & (1 << j)) c[idx[j]] = '1';
            else c[idx[j]] = '0';
        }
        for(int j = 0 ; j < n ; j++){
            int x = 0 ,y = 0;
            string ss = c;
            if(ss[j] == '0') ss[j] = '1';
            else ss[j] = '0';
            for(int k = 0 ; k < n - 1; k++){
                if(ss[k] == '0' and ss[k + 1] == '1') x++;
                else if(ss[k] == '1' and ss[k + 1] == '0') y++;
            }
            if(x == y) ans++;
            ans %= mod;
        }
    }
    cout << ans % mod << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

C-Tokitsukaze and Balance String (hard)

这个hard版就要用到刚才的规律了,另外他的数值有点大,开128才过,WA了几发是因为取模没有写规范,除法取模应该要直接算z - 1次方,而不是算z次方除2,这样会丢精度

#include
using namespace std;
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

inline void print(ll n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n % 10 + '0');
}
ll qmi(ll x,int y){
    ll res = 1;
    while(y){
        if(y & 1) res = ((res % mod) * x) % mod;
        x = (x * x) % mod;
        y >>= 1;
    }
    return res % mod;
}

void solve(){
    int n;
    cin >> n;
    string s;
    cin >> s;
    int z = 0;
    for(int i = 0 ; i < n ; i++) if(s[i] == '?') z++;
    ll x = qmi(2,z);
    ll ans = 0;
    if(n == 1){
        if(z == 1) cout << 2 << endl;
        else cout << 1 << endl;
        return;
    }
    if(n == 2){
        if(z == 2) cout << 4 << endl;
        else if(z == 1){
            if(s[1] == '1') cout << 2 << endl;
            else cout << 2 << endl;
        }else {
            if(s == "01" or s == "10") cout << 2 << endl;
            else cout << 0 << endl;
        }
        return;
    }
    if(s[n - 1] == s[0] and s[0] != '?') ans = ((x % mod) * ((n - 2) % mod)) % mod;
    else if(s[n - 1] != s[0] and s[0] != '?' and s[n - 1] != '?') ans = ((x % mod) * 2) % mod;
    else {
        x = qmi(2 ,z - 1);
        x %= mod;
        ans = (x * n) % mod;
    }
    ans %= mod;
    print(ans);
    printf("\n");
}
signed main(){
//    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

 D-Tokitsukaze and Concatenate‌ Palindrome

贪心,但是赛时一直没找对方向,导致没过,其实对与两个字符串,把能匹配的找出来,剩下的就是不匹配的了

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int n, m;
    cin >> n >> m;
    string a, b;
    cin >> a >> b;
    if(n < m){
        swap(n,m);
        swap(a,b);
    }
    map mp;
    for(auto x : a) mp[x]++;
    int sum1 = 0 ,sum2 = 0;
    for(auto x : b){
        if(mp[x]) mp[x]--;
        else sum1++;
    }
    for(auto x : mp)if(x.second & 1) sum2++;
    if(sum2 > sum1) {
        sum2 -= sum1;
        sum2 /= 2;
        sum2 += sum1;
        cout << sum2 << endl;
    }
    else cout << sum1 << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

四、牛客寒假训练营五

这一场家里有点事耽误了,赛后看了看感觉思维题居多,而我对于思维题感觉还是不太会写,要多做点CF锻炼下思维才行了

A-小L的三则运算

#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;


void solve(){
    int x;
    char c;
    cin >> x >> c;
    if(c == '+'){
        cout << 1 << " " << x-1 << endl;
        return;
    }if(c == '-'){
        cout << x+1 << " " << 1 << endl;
        return;
    }if(c == '*'){
        cout << x << " " << 1 << endl;
        return;
    }

}
signed main(){
    IOS
    int O_O = 1;
   // cin >> O_O;
    while(O_O--) solve();
}

J-小L的汽车行驶问题

模拟

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int n;
    cin >> n;
    string s;
    cin >> s;
    int t = 0 ,res = 0 ,ans = 0 ,cnt = 0;
    vector num;
    for(int i = 0 ; i < n ; i++){
        if(t > 0){
            t--;
            res += num[cnt];
            cnt++;
        }
        if(s[i] == '0') res += 10;
        else if(s[i] == '1') res = max(res - 5 ,0ll);
        else{
            t++;
            num.push_back(min(10ll ,res));
            res -= min(10ll ,res);
        }
        ans += res;
    }
    cout << ans << endl;
}
signed main(){
    IOS
    int O_O = 1;
//    cin >> O_O;
    while(O_O--) solve();
}

B-小L出师了

插空,但是要注意的就是最多只能分k+1段

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int n ,t ,k;
    cin >> n >> t >> k;
    n -= k;
    cout << min(n / t ,k+1) << endl;

}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

I-小L的数学题

思维题,n变到m只要n和m不是零都能实现

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int n ,m;
    cin >> n >> m;
    if(n == m){
        cout << "Yes" << endl;
        return;
    }
    if(n == 0 or m == 0){
        cout << "No" << endl;
        return;
    }
    cout << "Yes" << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

E-小L的井字棋

分类讨论,如果空着的地方为5 ,7 ,9,此时是必胜的,而对于其他情况就要判断连着的两个是否是空着的,是就必胜,没有满足条件的就是不能必胜。

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

char mp[3][3];

void solve(){
    int a[3] = {0},b[3] = {0};
    int l = 0 ,r = 0;
    for(int i = 0 ; i < 3 ; i++){
        for(int j = 0 ; j < 3 ; j++){
            cin >> mp[i][j];
        }
    }
    int cnt = 0;
    for(int i = 0 ; i < 3 ; i++){
        for(int j = 0 ; j < 3 ; j++){
            if(mp[i][j] == 'G') cnt++;
            if(mp[i][j] == 'O'){
                a[i] = 1 ,b[j] = 1;
                if(i == j) l = 1;
                if(i + j == 2) r = 1;
            }
        }
    }
    if(cnt == 9 or cnt == 7 or cnt == 5){
        cout << "Yes" << endl;
        return;
    }
    for(int i = 0 ; i < 3 ; i++){
        for(int j = 0 ; j < 3 ; j++){
            if(mp[i][j] == 'X'){
                if(a[i] == 0 or b[j] == 0 or (i == j and l == 0) or ((i + j==2) and r == 0)){
                    cout << "Yes" << endl;
                    return;
                }
            }
        }
    }
    cout << "No" << endl;
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

 L-小L的构造

构造题,又是思维方面的题,想要满足条件,要对3进行考虑,对于连续的六个数,设最小的为 x ,那么 x, x + 1, x + 3 与 x + 2, x + 4, x + 5 一定符合条件,因为 x + 3 与 x + 1 都是偶数,不互质,x 与 x + 1 互质, x + 3 与 x 相差 3 ,但它们都不是 3 的倍数,故互质。x + 2 与 x + 5 都是 3 的倍数,故不 互质,x + 4 与 x + 5 互质,x + 4 与 x + 2 是相邻的奇数,互质。故符合条件。

#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};



void solve(){
    int n;
    cin >> n;
    if(n < 4){
        cout << 0 << endl;
    }
    else if(n < 6){
        cout << 1 << endl;
        cout << "2 3 4" << endl;
    }
    else if(n == 6){
        cout << 2 << endl;
        cout << "1 2 4" << endl;
        cout << "3 5 6" << endl;
        return;
    }
    else if(n == 9){
        cout << "3" << endl;
        cout << "1 3 9" << endl;
        cout << "2 4 5" << endl;
        cout << "6 7 8" << endl;
        return;
    }
    else if(n/3 % 2){
        cout << n/3 << endl;
        cout << "1 3 9" << endl;
        cout << "2 4 5" << endl;
        cout << "6 7 8" << endl;
        for(int i = 10 ; i <= n - 5 ; i += 6){
            cout << i + 3 << ' ' << i + 5 << ' ' << i + 2 << endl;
            cout << i + 4 << ' ' << i + 1 << ' ' << i << endl;
        }
    }
    else{
        cout << n / 3 << endl;
        for(int i = 1 ; i <= n - 5 ; i += 6){
            cout << i + 5 << ' ' << i + 4 << ' ' << i + 2 << endl;
            cout << i + 3 << ' ' << i + 1 << ' ' << i << endl;
        }
    }
}
signed main(){
    IOS
    int O_O = 1;
    cin >> O_O;
    while(O_O--) solve();
}

五、小结

        本周是春节假期后的第一周训练,感觉还是没有从放假的状态里回过神来,牛客的训练营也缺了一场,补题貌似也有点少,后面还是要把状态调一调才行。

         从这周的训练来看,对于许多没用过的老算法似乎有点不熟悉了,例如牛客第四场的B,一开始只想着找规律,把二进制枚举给忘了,后面想起来已经WA了四发,这四发罚时本来不应该吃的;其次,对于一些小细节的处理也不到位,取模忘记了精度问题也导致了不少的罚时;还有就是天梯赛的模拟题,这种模拟题一般题目很长,代码量也比较大,这就非常考验代码功夫了,像这周天梯训练里的大模拟,就是写拉了一点导致还有6分没拿到,最后总分没到175。

        所以在后两周的训练里应该多写一些模拟题,练练码力,还有就是对于任何一个题都要仔细斟酌,考虑周全,减少罚时。

你可能感兴趣的:(算法,c++)