Acwing第 42 场周赛完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing第 42 场周赛完结相关的知识,希望对你有一定的参考价值。

老了,废了。该remake了。

目录

4311. 最小值【签到】

#include<bits/stdc++.h>
using namespace std;
int n,m;
double ans=1e9,a,b;
int main(void)

    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>a>>b,ans=min(ans,a/b);
    printf("%.6lf\\n",m*ans);
	return 0;

4312. 出现次数【前缀和 / KMP】


用的KMP获得位置,然后保存排序。
每次询问暴力查找,但过了r的时候break
比赛的时候想的前缀和,但是那个边界处理没想明白。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n,m,k,s[N];
char a[N],b[N];//让其下标从1开始
int ne[N];//ne[i]表示前i个字符的最长的相等的前后缀
vector<pair<int,int>>ve;
void init()

    for(int i=2,j=0;i<=n;i++)
    
        while(j&&a[i]!=a[j+1]) j=ne[j];
        if(a[i]==a[j+1]) j++;
        ne[i]=j;
    
    for(int i=1,j=0;i<=m;i++)
    
        while(j&&b[i]!=a[j+1]) j=ne[j];
        if(b[i]==a[j+1]) j++;
        if(j==n)//求a在b出现的所有的位置
        
            ve.push_back(i-n+1,i);
            j=ne[j];
        
    

int main(void)

    cin>>m>>n>>k;
    cin>>b+1>>a+1;
    init();
    sort(ve.begin(),ve.end());
    while(k--)
    
        int l,r; scanf("%d%d",&l,&r);
        int cnt=0;
        for(int i=0;i<ve.size();i++)
        
            int x=ve[i].first,y=ve[i].second;
            if(l<=x&&y<=r) cnt++;
            if(y>r) break;
        
        printf("%d\\n",cnt);
    
	return 0;

前缀和做法:我们将子串的开头作为标识。
故求 [l,r] 内的子串个数等于s[r-b.size()+1]-s[l-1]

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n,m,k,s[N];
string a,b;
int main(void)

    cin>>m>>n>>k;
    cin>>a>>b;
    a="0"+a;
    for(int i=1;i<a.size();i++)
    
        s[i]=s[i-1];
        if(a.substr(i,b.size())==b) s[i]++;
    
    while(k--)
    
        int l,r; scanf("%d%d",&l,&r);
        r=r-b.size()+1;
        if(r<l) cout<<0<<endl;
        else cout<<s[r]-s[l-1]<<endl;
    
	return 0;


4313. 满二叉树等长路径【递归 / 贪心】

//递归加贪心,因为是路径和,只要父节点增加,
//对应的子节点都会增加,所以只要把每个子节点搞成相同的即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int w[N],n,ans;
int dfs(int u)//子树到u的距离

    if(u>=pow(2,n+1)) return 0;
    int l=dfs(u*2)+w[u*2];
    int r=dfs(u*2+1)+w[u*2+1];
    ans+=abs(l-r);//俩子树弄成相同的值的花费
    return max(l,r);

int main(void)

    cin>>n;
    for(int i=2;i<pow(2,n+1);i++) cin>>w[i];
    dfs(1);
    cout<<ans;
    return 0;

以上是关于Acwing第 42 场周赛完结的主要内容,如果未能解决你的问题,请参考以下文章

Acwing第 31 场周赛完结

Acwing第 36 场周赛完结

Acwing第 56 场周赛完结

Acwing第 32 场周赛完结

Acwing第 59 场周赛完结

Acwing第 35 场周赛完结