牛客练习赛109(5题rk27)

牛客练习赛109(5题rk27)_第1张图片

A

#include
using namespace std;
#define int long long
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--){
        int x;
        cin>>x;
        if(x==0)cout<<0<<'\n';
        else if(x==1)cout<<1<<'\n';
        else if(x%2==0)cout<<2<<'\n';
        else cout<<3<<'\n';
    }
}

B

指针
一开始不在差分数组上做,wa了一发
后面换成差分数组上做就过了,我也不知道为啥

#include
#define int long long
using namespace std;
const int N=1e6+10;
int n,a[N],b[N],f[N];
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i]-a[i-1];
//     for(int i=1;i<=n;i++)cout<<"b["<
    int ans=1;
    for(int i=2;i<=n;i++){
        if(b[i]==1){
            int k=-1;
            int c=2;
            int j=i+1;
            while(j<=n&&b[j]==k*c)c++,k=-k,j++;
            j--;
//             cout<<"i="<=max(ans,j-i+2);
            i=j;
        }
    }
//     for(int i=1;i
//         int j=i+1;
//         int b=1;
//         int c=1;
//         while(j<=n&&a[j]==a[i]+b*c){
//             j++;
//             if(b==-1)c++;
//             b=-b;
//         }
//         j--;
//         ans=max(ans,j-i+1);
//         i=j;
//     }
    cout<<ans;
}

C

#include
using namespace std;
const int N=1e6+10;
int n,a[N],s[N],o[N],S[N];
vector<int>v[N];
void dfs(int i=1,int fa=0){
    int j=i+1;
//     cout<<"u="<while(s[a[i]]>1){
        
        int sz=s[a[j]];
        dfs(j,a[i]);
        sz=S[a[j]];
        j+=sz;
        s[a[i]]-=sz;
    }
    if(s[a[i]]==1){
        if(fa>0){
            if(fa<a[i])v[fa].push_back(a[i]);
            else v[a[i]].push_back(fa);
        }
    }
    return;
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>s[i],S[i]=s[i];
    dfs(1);
    for(int i=1;i<=n;i++){
//         for(auto j:v[i])cout<
        sort(v[i].begin(),v[i].end());
        for(auto j:v[i])cout<<i<<" "<<j<<'\n';
    }
}

D

#include
using namespace std;
#define int long long
const int N=3e5+10;
const int mod=1e9+7;
int n,m,k;
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>m>>k;
    multiset<int>S;
    int x;
    for(int i=1;i<=n;i++){
        cin>>x;
        S.insert(x);
    }
//     if(n==1){
//         cout<
//         return 0;
//     }
    while(k--){
        auto mi=S.begin();
        auto ma=--S.end();
        if(*mi==*ma){
            break;
        }
        int A=*mi;
        int B=*ma;
//         cout<<"max="<<*ma<<" min="<<*mi<
        int a=A+m;
        int b=B-m;
        if(b<=0){
            break;
        }
        if(A*B>=a*b)break;
        
        S.erase(mi),S.erase(ma);
        S.insert(a),S.insert(b);
    }
    int ans=1;
    for(auto x:S)ans=ans*x%mod;
    cout<<ans;
}

E

F

#include
#define int long long
using namespace std;
const int N=1e6+10;
int n,a[N],f[N],x,ans=1;
/*
对每一种值,我们只需要记录最左边的那个数字
对每一种可能性,我们只需要放进下一个需要的数字
每一个确切的数字,只会有一个数字去承接他的值
对于一个个建,有很多个值

*/
typedef pair<int,int>PII;

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    map<int,map<int,int>>mp;
    for(int i=1;i<=n;i++){
        cin>>x;
        if(mp.count(x)){
            for(auto [B,len]:mp[x]){
                int b=B;
                if(b>=0)b=-(b+1);
                else b=-(b-1);
                mp[x+b][b]=max(mp[x+b][b],len+1);
                ans=max(ans,len+1);
            }
            
        }
        else if(!mp.count(x+1))mp[x+1][1]=1;
    }
    cout<<ans;
}

你可能感兴趣的:(牛客,深度优先,图论,算法)