两道智力题
CF 527D
移项之后转化为线段覆盖问题
struct node{
int l,r;
};
void solve(){
int n;
cin>>n;
vector<node>a(n);
for(int i=0;i<n;++i){
int x,w;
cin>>x>>w;
a[i].l=x-w;
a[i].r=x+w;
}
sort(a.begin(),a.end(),[&](node a,node b){
if(a.r==b.r){
return a.l<b.l;
}
return a.r<b.r;
});
int ans=1,r=a[0].r;
for(int i=1;i<n;++i){
if(a[i].l>=r){
++ans;
r=a[i].r;
}
}
cout<<ans<<'\n';
return;
}
CF 519D
类似lc经典题,用map存一哈就可以了
map<ll,ll>mp[26];
void solve(){
vector<int>p(26);
for(int i=0;i<26;++i){
cin>>p[i];
}
string s;
cin>>s;
ll cnt=0,ans=0;
for(int i=0;i<s.size();++i){
ans+=mp[s[i]-'a'][cnt];
cnt+=p[s[i]-'a'];
mp[s[i]-'a'][cnt]++;
}
cout<<ans<<'\n';
return;
}