CF每日一练(2.10)

Posted chd-acm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF每日一练(2.10)相关的知识,希望对你有一定的参考价值。

CF-1093

1093A - Dice Rolling

  • 输出x/2即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t; cin >> t;
    while (t--)
    {
        int x; cin >> x;
        cout << x / 2 << endl;
    }
    return 0;
}

1093B - Letters Rearranging

  • 当且仅当字符串中所有字符都相同时,答案为-1
  • ans!=-1时,我们可以对字符排个序,然后输出即可。
#include <bits/stdc++.h>
using namespace std;
int t;
char s[1010];
int main(){
    cin>>t;
    while(t--){
        cin>>s;
        int flag = 0,len = strlen(s);
        for(int i=1;i<len;i++){
            if(s[i]!=s[0]){
                flag = 1;break;
            }
        }
        if(flag == 0)
            printf("-1
");
        else{
            sort(s,s+len);
            cout<<s<<endl;
        }
    }
    return 0;
}

1093C - Mishka and the Last Exam

  • 贪心,每次都让右边尽量大(或者让左边尽量小)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,x;
ll a[200100];
int main(){
    cin>>n>>x;
    a[1] = 0,a[n]=x;
    for(int i=2;i<=n/2;i++){
        cin>>x;
        if(x>=a[i-1]+a[n-i+2]){
            a[i] = x - a[n-i+2];
            a[n-i+1] = a[n-i+2];
        }
        else{
            a[i] = a[i-1];
            a[n-i+1] = x-a[i];
        }
    }
    for(int i=1;i<=n;i++)
        printf("%lld ",a[i]);
    puts("");
    return 0;
}

1093D - Beautiful Graph

  • 给定一个图,相邻两点权值奇偶性不同,权值只能为{1,2,3}。问有多少中赋权值的方法
  • 对于每一个联通块,先假设出发结点为奇数,那么与之相连的点都为偶数,bfs一遍即可算出有多少点为奇数,假设奇数为a个,偶数为b个,则该联通块方法数为:(a^2+b^2)
  • 不同的联通块答案相乘即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
int T,n,m;
vector<int> v[300010];
int vis[300010];
inline ll fast_pow(ll a,ll b){
    ll ans = 1%mod;
    for(;b;b>>=1){
        if(b&1) ans = (ans*a)%mod;
        a = (a*a)%mod;
    }
    return ans;
}
ll bfs(int x){
    vis[x] = 1;
    queue<int> q;
    q.push(x);
    int sum = 0,num = 0;//sum为该联通块总数,num为奇数个数
    while(!q.empty()){
        int u = q.front();q.pop();
        sum++;
        if(vis[u]==1)num++;
        for(int i=0;i<v[u].size();i++){
            int y = v[u][i];
            if(vis[y]!=0){
                //如果已经被访问过的v与u奇偶性相同,则返回0.最终答案也为0
                if(vis[y]+vis[u]!=3){
                    return 0;
                }
                continue;
            }
            vis[y] = 3-vis[u];
            q.push(y);
        }
    }
    ll ans = (fast_pow(2,num)+fast_pow(2,sum-num))%mod;
    return ans;
}
int main(){
    cin>>T;
    while(T--){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            v[i].clear();
            vis[i] = 0;
        }
        for(int i=1,x,y;i<=m;i++){
            scanf("%d%d",&x,&y);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        ll ans = bfs(1);
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                ans = (ans*bfs(i))%mod;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

以上是关于CF每日一练(2.10)的主要内容,如果未能解决你的问题,请参考以下文章

CF每日一练(2.9)

CF每日一练(1.16)

每日一练5

4.3 每日一练

CSDN|每日一练最大数

CSDN|每日一练最大数