AtCoder Beginner Contest 158(E、F


D - String Formation

注意点:

在字符串s的头部加上一个字符,用s=d+s会tle,要用s.insert(s.begin(),d)


E - Divisible Substring

题意:

给一个长度为n的数字串和一个质数p
问有多少个子串模p等于0

解法:

当p为2和5的时候,所有10的倍数模p都是0,例如(100a+10b+c)%p等价于c%p,因此只判断最后一位是否模p等于0即可。

其他情况正常写即可

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=5e5+5;
map<int,int>mark;
char s[maxm];
int n,p;
signed main(){
    cin>>n>>p;
    scanf("%s",s+1);
    int ans=0;
    if(p==2||p==5){
        for(int i=1;i<=n;i++){
            if((s[i]-'0')%p==0){
                ans+=i;
            }
        }
    }else{
        int base=1;
        int sum=0;
        mark[0]=1;
        for(int i=n;i>=1;i--){
            sum=(sum+(s[i]-'0')*base)%p;
            ans+=mark[sum];
            mark[sum]++;
            base=base*10%p;
        }
    }
    cout<<ans<<endl;
    return 0;
}

F - Removing Robots

题意:

N个机器人,第i个机器人在Xi位置上,若一个机器人被启动,则它将向右移动Di,移动完之后机器人会消失。
若途径别的机器人,则该机器人也将被激活然后向右移动(注意是经过,重合不算)。
现在你可以选择任意数量机器人启动,问最后有多少种剩余机器人的不同方案。
答案对998244353取模

解法:

首先肯定要按x排序
容易想到要从后往前推

令d(i)为后i个数的总方案数
如果i不启动。那么d(i)+=d(i+1)
否则d(i)+=d(k),其中k为i启动之后右边第一个碰不到的机器人。

维护每个i右边第一个碰不到的机器人用单调栈就行了。
总复杂度O(n)

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e5+5;
const int mod=998244353;
struct Node{
    int x,d;
}e[maxm];
int d[maxm];
int n;
bool cmp(Node a,Node b){
    return a.x<b.x;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].x>>e[i].d;
    }
    sort(e+1,e+1+n,cmp);
    d[n]=2;
    stack<int>s;
    s.push(n);
    for(int i=n-1;i>=1;i--){
        while(!s.empty()&&e[i].x+e[i].d>e[s.top()].x)s.pop();
        d[i]=d[i+1];
        if(!s.empty())d[i]=(d[i]+d[s.top()])%mod;
        else d[i]=(d[i]+1)%mod;
        s.push(i);
    }
    cout<<d[1]<<endl;
    return 0;
}

发布了445 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/105310476