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