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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章