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