Codeforces Round 905 (Div. 3)

题目链接

A.

先算距离,特判0的位置,最后加4

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    string s;cin>>s;s=" "+s;
    int last=1,now,ans=0;
    for(int i=1;i<s.size();i++){
        now=s[i]-'0';
       // cout<<now<<' '<<last<<'\n';

        if(now==0){
            if(last==0){
                last=0;
            }else {
                ans += 10 - last;
                last = 0;
            }
        }else{
            if(last==0){
                ans+=10-now;
                last=now;
            }else{
                ans+=abs(last-now);
                last=now;
            }
        }
        //cout<<now<<' '<<last<<' '<<ans<<'\n';
    }
    ans+=4;
    cout<<ans<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

B.

回文串形式:偶数对+最多单个字符

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n,k;cin>>n>>k;
    string s;cin>>s;
    vector<int>cnt(30,0);
    for(int i=0;i<s.size();i++){
        cnt[s[i]-'a']++;
    }
    int ou=0,ji=0;
    for(int i=0;i<26;i++){
        if(cnt[i]){
            if(cnt[i]%2==0)ou+=cnt[i];
            else {
                ou+=cnt[i]-1;
                ji++;
            }
        }
    }
    if(k==ji||k==ji-1){
        cout<<"YES"<<'\n';return ;
    }
    if(k<ji){
        cout<<"NO"<<'\n';return ;
    }
    cout<<"YES"<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

C.

因为k是2-5,除了4,其他都是质数
质数是最大的因数是自己

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n,k;cin>>n>>k;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    int mi=inf;
    if(k==4){
        if(n==1){
            mi=k-(a[1]%k);
        }else {
            int ou = 0;
            for (int i = 1; i <= n; i++) {
                if (a[i] % 2 == 0)ou++;
                if(a[i]%k==0){
                    mi=0ll;break;
                }
                mi=min(mi,k-(a[i]%k));
            }
            if (ou >= 2 )mi=0ll;
            else if(ou==0){
                mi=min(2ll,mi);
            }else if(ou==1){
                mi=min(1ll,mi);
            }
        }
    }else {
        for (int i = 1; i <= n; i++) {
            if (a[i] % k == 0) {
                mi = 0ll;
                break;
            }
            mi = min(mi, k - (a[i] % k));
        }
    }
    cout<<mi<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

D.

只要存在最早结束的点<最晚开始的点即可
用set处理的
debug:
st.end()的迭代器要--才指向最后一个元素

看了题解,把左右端点分开存并用multiset会更简便

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int q;cin>>q;
    set<pair<int,int>>st,end;
    map<pair<int,int>,int>mp;
    char op;
    int l,r;
    while(q--){
        cin>>op>>l>>r;
        if(op=='+'){
            if(mp[{l,r}]==0){
                st.insert({l,r});
                end.insert({r,l});
            }
            mp[{l,r}]++;
        }else{
            mp[{l,r}]--;
            if(mp[{l,r}]==0){
                st.erase({l,r});
                end.erase({r,l});
            }
        }
//        cout<<"st:\n";
//        for(auto t:st)cout<<t.first<<' '<<t.second<<'\n';
//        cout<<"end:\n";
//        for(auto t:end)cout<<t.first<<' '<<t.second<<'\n';
        if(st.size()>=2&&end.size()>=2){
            auto it=st.end();it--;
            auto itt=end.begin();itt++;
            int l1=(*st.end()).first,r1=(*st.end()).second;
            int l2=(*end.begin()).second,r2=(*end.begin()).first;
            if(l1==l2&&r1==r2){
                it--;
                if(r2<(*it).first||(*itt).first<l1){
                    cout<<"YES\n";
                }else cout<<"NO\n";
            }else{
//                cout<<"(*st.end()).first="<<(*st.end()).first<<'\n';
//                cout<<"(*st.end()).second="<<(*st.end()).second<<'\n';
//                cout<<"(*st.begin()).first="<<(*st.end()).first<<'\n';
//                cout<<"(*st.begin()).second="<<(*st.end()).second<<'\n';

             //   cout<<"(*end.begin()).irst="<<(*end.begin()).first<<' '<<(*st.end()).first<<'\n';
                if((*end.begin()).first<(*it).first){
                    cout<<"YES\n";
                }else cout<<"NO\n";
            }
        }else cout<<"NO\n";
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

E.

可以算出相邻数之间相差几个2,用前缀的方式做

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n,la;cin>>n>>la;
    int ans=0,sum=0;
    for(int i=1;i<n;i++){
        int a;cin>>a;
        int c1=0,c2=0;
        int l=la,r=a;
        while(l<r)l<<=1,++c1;
        while(l>r)r<<=1,++c2;
        sum+=c2-c1;sum=max(0ll,sum);ans+=sum;la=a;
    }
    cout<<ans<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

F.

一段合法的区间,左端点左边没有和左端点一样的数
右端点右边没有和右端点一样的数

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n;cin>>n;
    vector<int>a(n+1),pre(n+1);
    map<int,int>mp,mmp;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(mp[a[i]])pre[i]=pre[i-1];
        else {
            mp[a[i]]++;pre[i]=pre[i-1]+1;
        }
    }
    int ans=0;
    for(int i=n;i>=1;i--){
        if(mmp[a[i]])continue;
        mmp[a[i]]++;
        ans+=pre[i];
    }
    cout<<ans<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

posted @ 2024-02-11 16:26  WW爆米花  阅读(10)  评论(0编辑  收藏  举报