第 72 场双周赛【5999. 统计数组中好三元组数目:树状数组+等价转换】
1 class Solution { 2 public: 3 int countPairs(vector<int>& nums, int k) { 4 int s=0; 5 for(int i=0;i<nums.size();i++){ 6 for(int j=i+1;j<nums.size();j++){ 7 if(!((i*j)%k)){ 8 if(nums[i]==nums[j]) 9 s++; 10 } 11 } 12 } 13 return s; 14 } 15 };
1 class Solution { 2 public: 3 vector<long long> sumOfThree(long long num) { 4 vector<long long> ans; 5 if(num%3){ 6 return ans; 7 } 8 long long t=num/3; 9 ans.push_back(num/3-1),ans.push_back(num/3),ans.push_back(num/3+1); 10 return ans; 11 } 12 };
奇数肯定不行。偶数的话从最小的偶数2开始尝试,如果最后减到相同的话就累计到最后一位即可。
1 #define pb push_back 2 map<int,int> mp; 3 class Solution { 4 public: 5 vector<long long> maximumEvenSplit(long long finalSum) { 6 long long num=2; 7 mp.clear(); 8 vector<long long> ans; 9 if(finalSum%2) return ans; 10 while(1){ 11 if(finalSum>=num){ 12 if(!mp[num]){ 13 ans.pb(num); 14 mp[num]=1; 15 }else{ 16 ans[ans.size()-1]+=num; 17 mp[ans[ans.size()-1]]=1; 18 } 19 finalSum-=num; 20 num+=2; 21 // cout<<"1: "<<ans[ans.size()-1]<<endl; 22 }else{ 23 if(!finalSum) break; 24 if(mp[finalSum]) ans[ans.size()-1]+=finalSum; 25 else ans.pb(finalSum); 26 // cout<<"2: "<<ans[ans.size()-1]<<endl; 27 break; 28 } 29 } 30 return ans; 31 } 32 }; 33 /* 34 28 35 14 14 36 12 16 37 6 6 8 8 38 39 4 8 6 10 40 41 12 42 6 6 43 4 8 44 4 2 6 45 46 16 47 2 4 6 4 48 */
等价转换 + 树状数组
https://leetcode-cn.com/problems/count-good-triplets-in-an-array/solution/
1 #define ll long long 2 #define lowbit(x) (x&(-x)) 3 #define N 666666 4 5 //******************树状数组 6 ll tree[N]; 7 void add(int x,int y){ 8 for(int i=x;i<N;i+=lowbit(i)) tree[i]+=y; 9 return ; 10 } 11 ll ask(int x){ 12 ll sum=0; 13 for(int i=x;i;i-=lowbit(i)) sum+=tree[i]; 14 return sum; 15 } 16 ll query(int x,int y){ 17 return ask(y)-ask(x-1); 18 } 19 map<ll,ll> mp; 20 class Solution { 21 public: 22 long long goodTriplets(vector<int>& nums1, vector<int>& nums2) { 23 mp.clear(); 24 memset(tree,0,sizeof(tree)); 25 //转化NB 26 for(int i=0;i<nums1.size();i++) mp[nums1[i]]=i; 27 for(int i=0;i<nums2.size();i++){ 28 nums2[i]=mp[nums2[i]]+1; 29 } 30 ll ans=0; 31 int len=nums1.size(); 32 for(int i=0;i<nums2.size();i++){ 33 ll num=nums2[i]; 34 ll sum=query(1,num); 35 ans=ans+sum*(len-1-i-(num-sum)+1)*(1ll); 36 add(num,1); 37 } 38 return ans; 39 } 40 };