二次元音游人

这是一股照亮混沌的令和时代互联网的一道光,给在电子的海洋里冲浪的阿宅们带来笑容

codeforces 2210

Codeforces Round 1089 (Div. 2)

A. A Simple Sequence 417

image

\(a\) 数组倒序即可。\(n\ \text{mod}\ n-1 \geq n-1\ \text{mod}\ n-2 \geq ... \geq 2\ \text{mod}\ 1\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=2e5+5;
int a[N];
inline void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cout<<n-i+1<<" ";
    }
    cout<<'\n';
    return;
}
signed main(void){
    cin.tie(NULL)->sync_with_stdio(false);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
/*
5 4 3 2 1
*/

B. Simply Sitting on Chairs 831

image

假设最后一次坐的椅子是 \(k\),前面不能坐的椅子数量记作 \(cnt\),那么遍历 \(k\) 然后取 \(ans=max(ans,k-cnt)\)即可

\(pos_i\) 是标记的位置是 \(i\) 的对应椅子,一个椅子不能坐仅当 \(pos_i<i\),因为选前面的会导致第 \(i\) 个位置被占用,所以前面会跳过 \(pos_i\) 这把椅子,让 cnt++

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=2e5+5;
int a[N];
int pos[N];
inline void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        pos[a[i]]=i;
    }
    int ans=0;
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(pos[i]<i){
            cnt++;
        }
        ans=max(ans,i-cnt);
    }
    cout<<ans<<'\n';
}
signed main(void){
    cin.tie(NULL)->sync_with_stdio(false);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
/*
5
4 3 2 5 1

*/

C1. A Simple GCD Problem (Easy Version)

image

首先发现所有区间的最大公约数可以转换成相邻的两个数的最大公约数不变,因为 \(gcd(a_1,a_2,a_3)=gcd(gcd(a_1,a_2),a_3)\)

所以题目变成所有相邻的两个数的 \(gcd\) 不变

那么 \(a_1\)\(a_n\) 只和一个数相邻,中间的数和两个数相邻

\(G(i)\) 表示 \(gcd(a_i,a_{i+1})\),那么如果 \(G(1)<a_1\),就能转换,同理 \(G(n-1)<a_n\)

对于中间的数,则需要 \(lcm(G(i-1),G(i))<a_i\),这样的话 \(a_i'\) 同时满足两边的 \(gcd\) 不变。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=2e5+5;
int a[N],b[N];
inline void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
    int ans=0;
    if(__gcd(a[1],a[2])<a[1]){
        ans++;
    }
    for(int i=2;i<n;i++){
        int A=__gcd(a[i-1],a[i]);
        int B=__gcd(a[i],a[i+1]);
        int C=A*B/__gcd(A,B);
        if(C<a[i]) ans++;
    }
    if(__gcd(a[n-1],a[n])<a[n]){
        ans++;
    }
    cout<<ans<<'\n';
    return;
}
signed main(void){
    cin.tie(NULL)->sync_with_stdio(false);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
/*
5
4 3 2 5 1

*/

D. A Simple RBS Problem

image

题意:交换 \(s\) 中的任意次数的合法括号字串能否转化成 \(t\)

结论题,最外层的括号匹配肯定不能换,然后 () 相邻的左右括号也不能换。

统计 \(s\)\(t\) 中这两种的括号数量是否相同即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=5e5+5;
inline int cnt1(string c){
    int res=0;
    for(int i=0;i<n-1;i++){
        if(c[i]=='('&&c[i+1]==')'){
            res++;
        }
    }
    return res;
}
inline int cnt2(string c){
    int res=0;
    vector<int> match(n,-1);
    stack<int> tmp;
    for(int i=0;i<n;i++){
        if(c[i]==')'){
            match[tmp.top()]=i;
            tmp.pop();
        }
        else{
            tmp.push(i);
        }
    }
    int l=0,r=n-1;
    while(match[l]==r){
        l++,r--;
        res++;
    }
    return res;
}
inline void solve(){
    cin>>n;
    string s,t;
    cin>>s>>t;
    if(cnt1(s)==cnt1(t)&&cnt2(s)==cnt2(t)){
        cout<<"YES\n";
        return;
    }
    cout<<"NO\n";
    
    return;
}
signed main(void){
    cin.tie(NULL)->sync_with_stdio(false);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
posted @ 2026-04-03 00:34  超绝最可爱天使酱  阅读(54)  评论(0)    收藏  举报