Bootstrap

leetcode周赛399

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


;