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【找规律】

#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)

Codeforces Round #283 (Div. 2)CDE题解