首页 > 其他分享 >Codeforces Round 905 (Div. 3)

Codeforces Round 905 (Div. 3)

时间:2024-02-11 16:33:36浏览次数:23  
标签:905 int Codeforces long -- solve Div left define

题目链接

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();
    }
}

标签:905,int,Codeforces,long,--,solve,Div,left,define
From: https://www.cnblogs.com/wwww-/p/18012438

相关文章

  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
    目录题目链接题意题解代码题目链接C.DigitalLogarithm题意给两个长度位\(n\)的数组\(a\)、\(b\),一个操作\(f\)定义操作\(f\)为,\(a[i]=f(a[i])=a[i]\)的位数求最少多少次操作可以使\(a、b\)两个数组变得完全相同题解性质:对于任何数,经过两次操作我们一定可以让其变为\(......
  • CodeForces 1286C2 Madhouse (Hard version)
    洛谷传送门CF传送门可以把限制看成\(0.75n^2\)。发现\(0.75n^2=0.5n^2+2\times0.5(\frac{n}{2})^2\)。这启发我们询问一次\([1,n]\)和两次长度为\(\frac{n}{2}\)的区间。不妨问\([1,n],[1,\frac{n}{2}],[1,\frac{n}{2}+1]\)试试。注意到把\([1,\frac......
  • Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)
    很意思的一道构造题题意:给一个\(n、k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)*n/2\),每个数的范围为\([-1000,1000]\)这种构造题可以考虑就是前一段可以一直用一样的、最小的。我们观察可以发现\(k+k-(n+1)*n/2=(n+1)*n/2\)也就是所有子数组......
  • CodeForces 1927G Paint Charges
    洛谷传送门CF传送门看到\(n\le100\)考虑\(O(\text{poly}(n))\)dp。发现从左向右决策,因为一个点可以向左或向右覆盖,所以需要记最靠左的未覆盖的位置\(j\)和最靠右的已覆盖位置\(k\),状态就是\(f_{i,j,k}\),dp最小的覆盖次数。转移的讨论很简单。考虑不覆盖还是向左......
  • Codeforces Round 919 (Div. 2)
    https://codeforces.com/contest/1920B还行,C、Egood(E据说是很典的dp但我是dp苦手),D、F1无聊,F2不会A.SatisfyingConstraints*800有\(n\)个条件,每个条件形如\(x\gek,x\lek\)或\(x\neqk\),\(k\)为整数。问满足条件的整数\(x\)的个数。先处理\(\ge,\le\),得到限制......
  • CF1863F Divide, XOR, and Conquer 题解
    简要题意你有两个指针\(l,r\)初始时\(l=1,r=n\)。你可以操作若干次知道\(l=r\)。每次操作你可以选择一个整数\(k\in[l,r)\),记\(x=\bigoplus_{i=l}^ka_i,y=\bigoplus_{i=k+1}^ra_i\)。如果\(x\leqy\),你可以令\(l=k+1\)。如果\(x\geqy\),你可以令\(r=k\)。......
  • Codeforces Round 923 (Div. 3)赛后总结
    CodeforcesRound923(Div.3)A没什么好说的,纯秒。B一开始不知道怎么做,后面用了一个比较麻烦复杂的思路,可以做,但是开数时漏了数组0下标,导致样例一部分一直是空的。C非常简单的一道题,判断条件也比较好找,但是再提醒一遍自己,数组开大点,应该数组开小了,导致样例8没过真的气,最后......
  • Codeforces Round 260 (Div. 1)A. Boredom(dp)
    最开始写了一发贪心wa了,然后这种选和不选的组合优化问题,一般是考虑动态规划\(dp[i][0]:\)表示第i个数不选的最大值\(dp[i][1]:\)表示第i个数选的最大值考虑转移:\(dp[i][0]=max(dp[i-1][1],dp[i-1][0])\)\(dp[i][1]=dp[i-1][1]+a[i]*i\)需要将每一个数用一个桶统计次数因......
  • Codeforces Round 923 (Div. 3)
    A.MakeitWhiteA题不多说B.FollowingtheString题目一开始没看懂,后面发现数字是指字母出现的次数,读懂题目后就好做了,先把26个字母放在一个数组里全部初始化为0,然后用1次就加1,然后要根据数字来选数的话就可以遍历数组当满足就break;也可以通过集合。C.ChoosetheDifferent......
  • Codeforces Round 909 (Div. 3)
    题目链接A.若n是3的倍数,那么输出第二,因为不管先手如何操作,后手只要跟先手出的相反那么先手就永远不会赢其他情况,先手都能赢#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){intn;cin>>n;if((n+1)%3==0|......