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