Codeforces Round #496 (Div. 3)未完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #496 (Div. 3)未完结相关的知识,希望对你有一定的参考价值。
2022.3.5
题目地址:https://codeforces.com/contest/1005
目录
- A. Tanya and Stairways【找规律】
- B. Delete from the Left【模拟】
- C. Summarize to the Power of Two【哈希表】
- D. Polycarp and Div 3【DP】
- E1. Median on Segments (Permutations Edition)【思维】
A. Tanya and Stairways【找规律】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[N];
vector<int>ve;
int main(void)
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
if(a[i]>=a[i+1]) ve.push_back(a[i]);
cout<<ve.size()<<endl;
for(int i=0;i<ve.size();i++) cout<<ve[i]<<" ";
return 0;
B. Delete from the Left【模拟】
因为只能从前往后删,故就是求最长的相同的后缀
#include<bits/stdc++.h>
using namespace std;
int main(void)
string a,b; cin>>a>>b;
int cnt =0;
for(int i=a.size()-1,j=b.size()-1;i>=0;i--)
if(a[i]==b[j]) j--,cnt++;
else break;
cout<<a.size()-cnt+b.size()-cnt;
C. Summarize to the Power of Two【哈希表】
就是贪心,对于一个数枚举所有的可以和它匹配的数,然后记录。
注意标记,避免重复计算。
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp,st;
int s[35],n,x;
int main(void)
cin>>n;
for(int i=0;i<n;i++) cin>>x,mp[x]++;
for(int i=1,j=1;i<=31;i++,j*=2) s[i]=j;
int sum=0;
for(auto i=mp.begin();i!=mp.end();i++)
x=i->first;
for(int j=1;j<=31;j++)
if(s[j]>x)
int x1=x,x2=s[j]-x;
if(mp.count(x1)==0||mp.count(x2)==0) continue;//俩数有一个不存在
if(x1==x2)//相等
if(st[x1]) continue;//计算过了
if(mp[x1]<2) continue;//个数小于2
sum+=mp[x2];
st[x1]=1;
else
if(!st[x1]) sum+=mp[x1];//加过了
if(!st[x2]) sum+=mp[x2];//加过了
st[x1]=1,st[x2]=1;//记录已经选过了
cout<<n-sum<<endl;
return 0;
D. Polycarp and Div 3【DP】
dp[i] 表示前i个字符切割后 最多的可以被三整除的数字个数
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n,dp[N],s[N];
int main(void)
string a; cin>>a;
n=a.size();
a="0"+a;
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-'0';
for(int i=1;i<=n;i++)
for(int j=1;j<=min(i,100);j++)
//取后面的100个状态来转移 其实取10个就行了
int sum=s[i]-s[i-j];
if(sum%3) dp[i]=max(dp[i],dp[i-j]);
else dp[i]=max(dp[i],dp[i-j]+1);
cout<<dp[n];
return 0;
E1. Median on Segments (Permutations Edition)【思维】
- 如果区间长度是偶数:则
区间内小于等于m的数量
等于大于m的数量
- 如果区间长度是奇数:则
区间内小于等于m的数量
等于大于m的数量+1
设区间内小于等于m的数量
为a,区间内大于m的数量
为b,故:
- b-a=0
- b-a=-1
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
map<int,int>mp;
LL n,m,ans,a[N];
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
int pos,cnt=0;
for(int i=1;i<=n;i++) if(a[i]==m) pos=i;
for(int i=pos;i>=1;i--)
if(a[i]>m) cnt++;
else if(a[i]<m)cnt--;
mp[cnt]++;
cnt=0;//cnt表示的是大于m的数的个数和小于m的数的个数的差值
for(int i=pos;i<=n;i++)
if(a[i]>m) cnt++;
else if(a[i]<m) cnt--;
ans+=mp[-cnt];
ans+=mp[-cnt+1];
cout<<ans;
return 0;
以上是关于Codeforces Round #496 (Div. 3)未完结的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #496 (Div. 3)未完结
Codeforces Round #496 (Div. 3)
Codeforces Round #496 (Div. 3) ABCDE1
Codeforces Round #496 (Div. 3)A~F
CodeForces -Codeforces Round #496 (Div. 3) E2. Median on Segments (General Case Edition)