牛客周赛 Round 82【题解完成】

90 阅读2分钟
题目难度知识点
A 夹心饼干!签到
B 食堂大作战1.0签到
C 食堂大作战2.0签到
D 小苯的排列计数思维/找规律
E 和+和★ ★思维
F 怎么写线性SPJ★★构造

image.png 最后一题构造题没看懂,不太会写。

夹心饼干

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],t,n;
int main(void)
{
    string s; cin>>s;
    if(s[0]==s[2]) puts("YES");
    else puts("NO");
    return 0;
}

食堂大作战1.0

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],t,n;
int main(void)
{
    cin>>n;
    map<int,int>mp;
    for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
    int flag=1;
    for(int i=0;i<n;i++) if(mp[a[i]]>1) flag=0;
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}

食堂大作战2.0

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],n;
set<int>st;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],st.insert(a[i]);
    if(st.size()!=n) puts("NO");
    else{
        puts("YES");
        vector< pair<int,int> >ve;
        for(int i=1;i<=n;i++) ve.push_back({a[i],i});
        sort(ve.begin(),ve.end());
        for(int i=0;i<ve.size();i++) cout<<ve[i].second<<" ";
    }
    return 0;
}

小苯的排列计数

6 2 2 1 1 1 1 6 2 (3,4,5,7) 1 (3!)=4*3! 可以找到规律

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
const int mod=998244353;
typedef long long int LL;
LL a[N],t,n;
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    LL temp=1e9,flag=1;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>temp) flag=0;
        temp=min(temp,a[i]);
    }
    if(flag)
    {
        LL sum=1;
        for(int i=1;i<=n;i++)
        {
            int j=i;
            while(j+1<=n&&a[j+1]==a[i]) j++;
            int len=j-i+1;
            for(LL k=(n-a[i]-(i-1)),cnt=1;cnt<=len-1;cnt++,k--) sum=sum*k%mod;
            i=j;
        }
        cout<<sum%mod<<'\n';
    }else puts("0");
}
int main(void)
{
    cin>>t;
    while(t--) solve();
    return 0;
}

和+和

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
const int mod=998244353;
typedef long long int LL;
LL a[N],b[N],n,k;
LL s1[N],s2[N];
int main(void)
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    priority_queue<int>q1,q2;
    for(int i=1;i<=k;i++) s1[i]=s1[i-1]+a[i],q1.push(a[i]);
    for(int i=k+1;i<=n;i++)
    {
        if(a[i]<q1.top())
        {
            s1[i]=s1[i-1]-q1.top()+a[i];
            q1.pop(); q1.push(a[i]);
        }else s1[i]=s1[i-1];
    }
    for(int i=n,j=1;i>=1&&j<=k;i--,j++) s2[i]=s2[i+1]+b[i],q2.push(b[i]);
    for(int i=n-k;i>=1;i--)
    {
        if(b[i]<q2.top())
        {
            s2[i]=s2[i+1]-q2.top()+b[i];
            q2.pop(); q2.push(b[i]);
        }else s2[i]=s2[i+1];
    }
    LL ans=1e18;
    for(int i=1;i<=n;i++)
    {
        int len1=i;
        int len2=n-i;
        if(len1>=k&&len2>=k) ans=min(ans,s1[i]+s2[i+1]);
    }
    cout<<ans;
    return 0;
}

怎么写线性SPJ

image.png

1
12
121
1213
12131
121312
1213121
12131214
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int n; cin>>n;
    int now=1;
    vector<int>ans;
    while(ans.size()<n)
    {
        vector<int>temp;
        for(int i=0;i<(int)ans.size()-1;i++)
            temp.push_back(ans[i]);
        temp.push_back(now);
        for(int i=0;i<temp.size();i++)
        {
            ans.push_back(temp[i]);
            if(ans.size()==n) break;
        }
        now++;
    }
    set<int>st;
    for(int i=0;i<ans.size();i++) st.insert(ans[i]);
    cout<<st.size()<<'\n';
    for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
    return 0;
}