A.优质数对的总数I
思路:模拟
ac代码:
class Solution {
public:
int numberOfPairs(vector<int>&a, vector<int>& b, int k) {
int n=a.size(),m=b.size();
int cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i]%(b[j]*k)==0) cnt++;
return cnt;
}
};
B.压缩字符串III
思路:模拟
ac代码:
class Solution {
public:
string compressedString(string a) {
string s;
for(int i=0,j=0;i<a.size();){
int cnt=0;
while(a[i]==a[j]) i++,cnt++;
if(cnt>=9){
s+='9';
s+=a[j];
j=j+9;
i=j;
}else{
s+=cnt+'0';
s+=a[j];
j=j+cnt;
i=j;
}
}
return s;
}
};
C.优质数对的总数II
思路:贡献法累加求a数组中的每个获得的贡献
ac代码:
class Solution {
typedef long long ll;
public:
long long numberOfPairs(vector<int>& a, vector<int>& b, int k) {
map<ll,ll>mp;
for(int i=0;i<b.size();i++)
mp[(ll)b[i]*k]++;
ll cnt=0;
for(int i=0;i<a.size();i++){
ll x=a[i];
for(int j=1;j*j<=x;j++)
if(x%j==0){
cnt+=mp[j];
if(j!=x/j) cnt+=mp[x/j];
}
}
return cnt;
}
};
D.不包含相邻元素的子序列的最大和
思路:经典线段树求打家劫舍问题
AC代码:
class Solution {
public:
typedef long long ll;
const int mod=1e9+7;
ll t[300000][4];
void push_up(int p){
auto a=t[p*2],b=t[p*2+1];
t[p][0]=max(a[0]+b[2],a[1]+b[0]);
t[p][1]=max(a[0]+b[3],a[1]+b[1]);
t[p][2]=max(a[2]+b[2],a[3]+b[0]);
t[p][3]=max(a[2]+b[3],a[3]+b[1]);
}
void build(vector<int>& nums,int p,int l,int r){
if(l==r){
t[p][3]=max(nums[l],0);
return;
}
int m=(l+r)>>1;
build(nums,p*2,l,m);
build(nums,p*2+1,m+1,r);
push_up(p);
}
void change(vector<int>& nums,int p,int l,int r,int idx,int v){
if(l==r&&r==idx){
t[p][3]=max(v,0);
return;
}
int m=(l+r)>>1;
if(idx<=m){
change(nums,p*2,l,m,idx,v);
}else{
change(nums,p*2+1,m+1,r,idx,v);
}
push_up(p);
}
int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {
long long ans=0;
build(nums,1,0,nums.size()-1);
for(auto p:queries){
change(nums,1,0,nums.size()-1,p[0],p[1]);
ans+=t[1][3];
ans%=mod;
}
return ans;
}
};