传送门
A - Even Substrings
解题思路:从前往后遍历,如果当前s[i]是偶数,那以它为结尾那就有i+1种可能。
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
int n;
string s;
int main(){
std::ios::sync_with_stdio(0);
cin>>n>>s;
ll ans=0;
for(int i=0;i<(int)s.size();++i){
if((s[i]-'0')%2==0) ans+=i+1;
}
cout<<ans<<endl;
return 0;
}
B - Chocolates
解题思路:既然前面买巧克力的个数被后面所限制,那我们就从后往前考虑,a[i]=min(a[i],a[i+1]-1)来决定。
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=2e5+5;
int n,a[maxn];
int main(){
std::ios::sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
ll ans=a[n];
for(int i=n-1;i>=1;--i){
a[i]=min(a[i],a[i+1]-1),ans+=a[i];
if(a[i]==0) break;
}
cout<<ans<<endl;
return 0;
}