其他分享
首页 > 其他分享> > Codeforces Round #697 (Div. 3)题解报告(A-G)

Codeforces Round #697 (Div. 3)题解报告(A-G)

作者:互联网

考完雅思了开始康复训练...争取以后每把都打不咕。

A.Odd Divisor

Editorial:偶数有个特性就是可以一直除2,所以我们只需要判断无限除2之后的奇数是不是1即可。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define eps 0.000000001
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int maxn=1e5+5;
int main(){
    int T;scanf("%d",&T);
    while(T--){
        ll n;scanf("%lld",&n);
        if(n%3==0){puts("YES");continue;}
        while(n%2==0){
            n/=2;
        }
        if(n==1){puts("NO");continue;}
        if(n%2==1){
            puts("YES");
        }else{
            puts("NO");
        }
    }
}
View Code

 

B. New Year's Number

Editorial:先尽可能把2020减去,最后会发现一些多余的数,这个时候对多余的数特判,看是否多余2020的组数即可。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define eps 0.000000001
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int maxn=1e5+5;
int main(){
    int T;scanf("%d",&T);
    while(T--){
        int n;scanf("%d",&n);
        int d=n/2020;
        int re=n-d*2020;
        if(re>d) puts("NO");
        else puts("YES");
    }
}
View Code

 

C. Ball in Berland

Editorial:这个题刚拿到手我就想二分图做法(划掉),但是发现好像不太容易维护边与边之间的关系所以叉掉。 于是正确做法是统计a和b每个人在预配对中的数量,然后O(n)扫一遍枚举统计,因为不可能出现2组a和b都是同一个人的情况,所以mp[a]就代表和a挂钩的人,同理mp[b]代表和b挂钩的人,这时候要处理的时候记得+1,因为a和b自己有搭班。所以最后的时候就把这些结果加起来就ok啦。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define eps 0.000000001
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int maxn=2e5+5;
int a[maxn],b[maxn];
map<int,int> mp1,mp2; 
int main(){
    IO;
    int T;scanf("%d",&T);
    while(T--){
        int x,y,n;scanf("%d%d%d",&x,&y,&n);
        rep(i,1,n) scanf("%d",&a[i]),mp1[a[i]]+=1;
        rep(i,1,n) scanf("%d",&b[i]),mp2[b[i]]+=1;
        ll ans=0;
        rep(i,1,n){
            ans+=(n-mp1[a[i]]-mp2[b[i]]+1);
        }
        cout<<ans/2<<endl;
        mp1.clear();mp2.clear();        
    }
}
View Code

 

D. Cleaning the Phone

Editorial:这个题比赛的时候没写出来qwq想着用背包去做但是背包背不下那么大的数据所以肯定得用贪心啦。做法就是对价格为1和2的分别从大到小排序之后分别预处理,以价值2的为例,肯定越往前单个体积越大,所以在每一次处理的时候二分寻找适合的最低的a就行(双指针也可以,因为方向是恒定的),还有记得开ll,扫的时候要从0开始扫

 

标签:const,697,int,题解,ll,Codeforces,--,scanf,define
来源: https://www.cnblogs.com/Anonytt/p/14329656.html