Codeforces Round #479 (Div. 3)完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #479 (Div. 3)完结相关的知识,希望对你有一定的参考价值。
2022.2.28 开始复盘div3
题目链接:https://codeforces.com/contest/977
目录
- A. Wrong Subtraction【签到模拟题】
- B. Two-gram【简单思维题】
- C. Less or Equal【二分】
- D. Divide by three, multiply by two【爆搜】
- E. Cyclic Components【找干净环】
- F. Consecutive Subsequence【DP 特殊的最长上升子序列】
A. Wrong Subtraction【签到模拟题】
#include<bits/stdc++.h>
using namespace std;
int main(void)
int n,k; cin>>n>>k;
while(k--)
if(n%10) n--;
else n/=10;
cout<<n;
return 0;
B. Two-gram【简单思维题】
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
string a,s;
unordered_map<string,int>mp;
int main(void)
cin>>n>>a;
for(int i=0;i+1<n;i++)
string temp;
temp=temp+a[i]+a[i+1];
mp[temp]++;
if(mp[temp]>cnt) cnt=mp[temp],s=temp;
cout<<s;
return 0;
C. Less or Equal【二分】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n,k,a[N];
int check(int x)
int cnt=0;
for(int i=0;i<n;i++) if(a[i]<=x) cnt++;
return cnt;
int main(void)
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
int l=1,r=1e9;
while(l<r)
int mid=l+r>>1;
if(check(mid)>=k) r=mid;
else l=mid+1;
if(check(l)==k) cout<<l;
else cout<<-1;
return 0;
D. Divide by three, multiply by two【爆搜】
爆搜,注意开long long
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N],n;
unordered_map<LL,LL>mp;
vector<LL>ve,ans;
void dfs(LL x,int index)
if(index==n-1)
ans=ve;
return;
if(mp[x*2])
mp[x*2]--,ve.push_back(x*2);
dfs(x*2,index+1);
mp[x*2]++,ve.pop_back();
if(x%3==0&&mp[x/3])
mp[x/3]--,ve.push_back(x/3);
dfs(x/3,index+1);
mp[x/3]++,ve.pop_back();
int main(void)
cin>>n;
for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
for(int i=0;i<n;i++)
mp[a[i]]--;
ve.clear(),ve.push_back(a[i]);
dfs(a[i],0);
if(ans.size())
for(int j=0;j<ans.size();j++) cout<<ans[j]<<" ";
return 0;
mp[a[i]]++;
return 0;
E. Cyclic Components【找干净环】
题目找的环是干净的,即不可以是多个环连着的,或着环有多余的边。
所以不能用常规的并查集找环的方法。
通过观察你会发现,这种干净的环,环上的点度数都是2
故我们可以先处理各个点的度数。
然后再跟常规的并查集找环一样,不过需要注意的是度数不为2的点都不是环上的点,故直接跳过。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int n,m,p[N],d[N],cnt;
int a[N],b[N];
int find(int x)
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=0;i<m;i++)
cin>>a[i]>>b[i];
d[a[i]]++,d[b[i]]++;//记录度数
for(int i=0;i<m;i++)
if(d[a[i]]!=2||d[b[i]]!=2) continue;//度数不为2直接跳过
if(find(a[i])==find(b[i])) cnt++;//是环
else p[find(a[i])]=find(b[i]);
cout<<cnt;
return 0;
F. Consecutive Subsequence【DP 特殊的最长上升子序列】
题目的意思就是让我们找一个最长的上升子序列,这里的上升是有条件的。
即: 2,3,4,5…
2,5,7 这是递增的但是不满足题意
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL a[N],n,max_len,ed;
map<LL,int>mp;
int main(void)
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
mp[a[i]]=mp[a[i]-1]+1;//即当前结尾的最大的长度
int len=mp[a[i]];
if(len>max_len)
max_len=len;//记录最长的长度
ed=a[i];//结束的值
LL st=ed-max_len+1;//开头
printf("%d\\n",max_len);
for(int i=1;i<=n;i++)
if(st==a[i]) printf("%d ",i),st++;
return 0;
以上是关于Codeforces Round #479 (Div. 3)完结的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #479 (Div. 3)题解
Codeforces Round #479 (Div. 3) 题解
Codeforces Round #479 (Div. 3)解题报告
[CF977X]Codeforces Round #479 (Div. 3)
Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)
Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two