classSolution{public:int n;int w[1010];structnode{int l,r;int gcd;}tr[4010];voidpushup(int u){
tr[u].gcd =__gcd(tr[u <<1].gcd, tr[u <<1|1].gcd);}voidbuild(int u,int l,int r){if(l == r) tr[u]={l, r, w[l]};else{
tr[u]={l,r};int mid = l + r >>1;build(u <<1, l, mid);build(u <<1|1, mid +1, r);pushup(u);}}intquery(int u,int l,int r){if(tr[u].l >= l && tr[u].r <= r)return tr[u].gcd;else{int mid = tr[u].l + tr[u].r >>1;if(r <= mid)returnquery(u <<1, l, r);if(l > mid)returnquery(u <<1|1, l, r);return__gcd(query(u <<1, l, r),query(u <<1|1, l, r));}}intsubarrayGCD(vector<int>& a,int k){
n = a.size();for(int i =0; i < n; i ++) w[i +1]= a[i];build(1,1, n);int res =0;for(int i =1; i <= n; i ++)for(int j = i; j <= n; j ++){if(__gcd(w[i], w[j])< k)continue;if(query(1, i, j)== k) res ++;}return res;}};
T3 使数组相等的最小开销 — 数学 + 思维
typedeflonglong LL;classSolution{public:longlongminCost(vector<int>& nums, vector<int>& cost){
vector<pair<int,int>> vec;int n = nums.size();for(int i =0; i < n; i ++) vec.push_back({nums[i], cost[i]});sort(vec.begin(), vec.end());
LL cost1 =0, cost2 =0;for(auto x : cost) cost2 += x;
LL s1 =0, s2 =0;for(int i =0; i < n; i ++) s2 +=(LL)nums[i]* cost[i];
LL res = s2, pre =0;for(int i =0; i < n; i ++){
LL x = vec[i].first, y = vec[i].second;
s2 -=(LL)cost2 *(x - pre);
s1 +=(LL)cost1 *(x - pre);
res =min(s1 + s2, res);
pre = x;
cost1 += y;
cost2 -= y;}return res;}};
T4 使数组相似的最少操作次数 — 贪心
typedeflonglong LL;classSolution{public:longlongmakeSimilar(vector<int>& a, vector<int>& b){int n = a.size();
vector<int> vec1[2], vec2[2];for(int i =0; i < n; i ++){
vec1[a[i]%2].push_back(a[i]);
vec2[b[i]%2].push_back(b[i]);}sort(vec1[0].begin(),vec1[0].end());sort(vec1[1].begin(),vec1[1].end());sort(vec2[0].begin(),vec2[0].end());sort(vec2[1].begin(),vec2[1].end());
LL res =0;int m1 = vec1[0].size(), m2 = vec1[1].size();for(int i =0; i < m1; i ++) res +=abs(vec1[0][i]- vec2[0][i]);for(int i =0; i < m2; i ++) res +=abs(vec1[1][i]- vec2[1][i]);return res /4;}};