首页 > 其他分享 >Codeforces Round 945 (Div. 2)

Codeforces Round 945 (Div. 2)

时间:2024-05-18 14:30:39浏览次数:20  
标签:return int 945 Codeforces ans const Div define mod

A-Chess For Three
因为序列满足a<=b<=c的情况
显然通过得分可以观察出得分总和必定为偶数
否则不成立
求的是最大平局数
那么直接假设全部都是平局
这时候发现如果c过大会导致后面的局数不是平局
那么只用把c>a+b的情况取出
而此时平均数为a+b

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int mod=1e9+7;
int qpw(int a,int b){int ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
int inv(int x){return qpw(x,mod-2);}
const int N=2e5+10;
void solve(){
    int a,b,c;
    cin>>a>>b>>c;
    if((a+b+c)%2){
        cout<<-1<<'\n';
    }else {
        if(a+b>=c)
        cout<<(a+b+c)/2<<'\n';
        else {
            cout<<a+b<<'\n';
        }
    }
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int _=1;
    cin>>_;
    while(_--)solve();
}

B-Cat, Fox and the Lonely Array
二进制之间求最大的距离
先从简单的情况想
如果只有1和0
那么这题的最大或和
为两个1之间最远的距离
1 0 1 0 1 此时为2
1 0 0 0 1 此时为4
1 0 1 0 0 1 此时为3
那么很容易就想到
如果把它从二进制进行拆分
那么只需要求每个位上面的1之间的最大距离
为什么是最大
因为只有最大才能满足所有的需求
有点小细节要抠一下
比如
1 0 0 0 0 是5

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int mod=1e9+7;
int qpw(int a,int b){int ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
int inv(int x){return qpw(x,mod-2);}
const int N=2e5+10;
void solve(){
    int n;cin>>n;
    vector<int>a(n);
    for(auto &t:a)cin>>t;
    int len=1;
    for(int k=0;k<=20;k++){
        int nl=0;
        for(int i=0;i<n;i++){
            if((a[i]>>k&1)==0){
                nl++;
            }
            else len=max(len,nl+1),nl=0;
        }
        if(nl==n)continue;
        len=max(nl+1,len);
    }
    cout<<len<<'\n';
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int _=1;
    cin>>_;
    while(_--)solve();
}

C-Cat, Fox and Double Maximum
一道非常简单的构造
个人认为难度小于B
首先考虑如何构造一个凸的点
通过观察发现
其中凸点的个数必定为n/2-1
那么我们可以把头删去或者把尾删去来构造凸点
那么必定存在一组成立
把删去的点设为n/2+1
对其中的凸点从小到大赋值为n-i
对凹点从小到大赋值为n/2-i
因为删去的点赋值为n/2+1
所以存在差值
所以两组构造中必有一组成立

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int mod=1e9+7;
int qpw(int a,int b){int ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
int inv(int x){return qpw(x,mod-2);}
const int N=2e5+10;
void solve(){
    int n,evenans,oddans;cin>>n;
    vector<int>a(n),b(n/2),c(n/2-1),vis(n+1);
    for(int i=0;i<n;i++)cin>>a[i];
    auto ck=[&](){
        int cnt=0;
        for(int i=1;i<n-1;i++){
            if(vis[a[i]]+a[i]>a[i-1]+vis[a[i-1]]&&vis[a[i]]+a[i]>vis[a[i+1]]+a[i+1])cnt++;
        }
        return cnt==n/2-1;
    };
    auto print=[&](){
        for(int i=0;i<n;i++)cout<<vis[a[i]]<<" \n"[i==n-1];
    };
    vis[a[0]]=n/2+1;
    for(int i=1;i<n;i++){
        if(i&1){
            b[i/2]=a[i];
        }
        else c[i/2-1]=a[i];
    }
    sort(all(b));
    sort(all(c));
    for(int i=0;i<n/2-1;i++)vis[c[i]]=n-i;
    for(int i=0;i<n/2;i++)vis[b[i]]=n/2-i;
    if(ck()){
        print();return;
    }
    vis[a[n-1]]=n/2+1;
    for(int i=0;i<n-1;i++){
        if(i&1){
            c[i/2]=a[i];
        }
        else b[i/2]=a[i];
    }
    sort(all(b));
    sort(all(c));
    for(int i=0;i<n/2-1;i++)vis[c[i]]=n-i;
    for(int i=0;i<n/2;i++)vis[b[i]]=n/2-i;
    print();
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int _=1;
    cin>>_;
    while(_--)solve();
}

标签:return,int,945,Codeforces,ans,const,Div,define,mod
From: https://www.cnblogs.com/archer233/p/18199315

相关文章

  • Codeforces 769B News About Credit 题解
    题目简述波利卡普在由$n$名学生(包括他自己)组成的小组中学习,编号为$1$到$n$,波利卡普的编号始终是$1$。他们都在社交网络上注册,每个学生都有一个值$a_i$,表示第$i$名学生每天能发送的最大信息数。清晨,波利卡普知道了一个重要消息,他认为有必要通过私人消息紧急通知所有组员......
  • CF-945(已更A,B)
    CF-945(A,B)A分析模拟合法情况下三个数的和只能是偶数:题中的两种操作显然都不会改变和的奇偶性这点我的代码中没有用到要使平局数最多,一定是最大的两个数减一,重复这个过程,直到两个较小的数都为零,且最大数一定是偶数,否则不合法:可以由题意和样例想到代码inta[4];voidso......
  • Codeforces 959B Mahmoud and Ehab and the message 题解
    题目简述小A想要给他的朋友小B发送了一条有$m$个单词的消息。他们的语言由编号从$a_1$到$a_n$的$n$个单词组成。一些单词具有相同的意思,因此存在$k$个单词组,其中每个组中的所有单词具有相同的意思。小A知道第$i$个单词可以以成本$m_i$发送。对于他的每个消息......
  • Codeforces 1113B Sasha and Magnetic Machines 题解
    题目简述有一个长度为$n$的正整数序列。你可以对这个数列进行最多$1$次的如下操作:选择两个数$i$和$j$,其中$1\leqi,j\leqn$并且$i\neqj$,并选择一个可以整除$a_i$的正整数$x$,然后将$a_i$变为$\frac{a_i}{x}$,将$a_j$变为$a_j\cdotx$。问你操作后,该序......
  • Codeforces 1178B WOW Factor
    题目简述给定一个只含$v$和$o$的字符串$s$,求字符串中有多少个$wow$(一个$w$即为连续的两个$v$)。题目分析考虑枚举每一个$o$,设下标为$i$,统计它左边和右边各有多少个$w$,分别设为$a_{i-1}$和$b_{i+1}$,依据乘法原理,将它们乘起来即为答案,累加即可。接下来,考虑怎么处......
  • Codeforces 1037C Equalize 题解
    题目描述给定两个长度为$n$的$01$序列$a,b$。每次可以执行如下操作:在$a$中选择一个位置$p$,将$a_p$变为$1-a_p$,代价是$1$。在$a$中选择两个位置$p,q$,将$a_p$和$a_q$互换,代价是$\lvertq-p\rvert$。问最少需要多少代价才能将$a$变成$b$。题目分析......
  • 「比赛总结」CF Round 834 Div.3 比赛总结
    比赛链接最后AC了\(6\)题。首先开局拼手速过了前三题。然后一眼没有瞪出来D,就写了个随机化,然后交上去发现TLEontest#3,发现随机化的时候阙值取太大了,然后就把阙值改小了,然后交上去发现WAontest#3,这也太不牛了吧!于是赶紧跳了。然后看到E,这不是个傻逼题吗?严格小于......
  • D. Deleting Divisors
    https://codeforces.com/contest/1537/problem/D题意:给定数n,alice和bob博弈,alice先手。每次操作可以减去当前n的一个因子,并且该因子不能为n和1。问谁必胜。思路:策略分析。基础分析:如果n是奇数,那么没有偶数因子。如果n是偶数,可能有偶数因子和奇数因子,如果只有偶数因子,n是2的整数......
  • Codeforces 1004B Sonya and Exhibition 题解
    题目简述让你构造一个长度为$n$的$01$字符串。一个区间的价值为其中$0$的数量乘以$1$的数量,给出$m$个区间,最大化它们的价值之和。题目分析设区间$[l,r]$中$1$有$x$个,$0$有$y$个,当$x$和$y$最接近的时候,$x\timesy$最大,此结论可以用二次函数进行证明。......
  • Codeforces Round 943 (Div. 3)
    CodeforcesRound943(Div.3)1968D-枚举思路:每个人走的位置最多会形成长度为n的环,所以直接枚举走到某个位置之后后面就不走了的所有情况的最大值,相互比较即可1968E-构造题意:设\(F(A_i,A_j)=|x_i-x_y|+|y_i-y_j|\),在\(N*N\)的矩阵中选n个点使所有不同的\(F(A_i,A_j)=|x_i-......