Code in cpp
Создано: 30 ноября 2025 г.
Отвечено с использованием GPT-5.1 Thinking от Chat01
Создано: 30 ноября 2025 г.
Отвечено с использованием GPT-5.1 Thinking от Chat01
Here’s a clean C++ solution for “Minimum Absolute Distance Between Mirror Pairs”:
cpp#include <bits/stdc++.h> using namespace std; class Solution { public: // Reverse digits of a non-negative integer, dropping leading zeros int reverseNum(int x) { int rev = 0; while (x > 0) { rev = rev * 10 + (x % 10); x /= 10; } return rev; } int minMirrorPairDistance(vector<int>& nums) { unordered_map<int,int> lastIndexOfReversed; // value -> last index i with reverse(nums[i]) == value int n = nums.size(); int ans = INT_MAX; for (int i = 0; i < n; ++i) { // Treat current i as j in (i_prev, i): // need reverse(nums[i_prev]) == nums[i] <=> nums[i] is in map auto it = lastIndexOfReversed.find(nums[i]); if (it != lastIndexOfReversed.end()) { ans = min(ans, i - it->second); // i > it->second always } // Now treat current index as the "i" of future pairs int r = reverseNum(nums[i]); lastIndexOfReversed[r] = i; // keep closest (largest) index } return ans == INT_MAX ? -1 : ans; } };
Idea in one line:
Scan from left to right, keep for each value v the last index where reverse(nums[index]) == v; when at position i, if nums[i] is already in the map, we’ve found a mirror pair ending at i, and we update the minimum distance.
pythonprint("test")
pythonimport os, textwrap, itertools, math, statistics print(os.listdir('/mnt/data'))
pythonimport PIL, sys, pkgutil, inspect, math, os, textwrap print(PIL.__version__)
pythonprint(any(m.name=='pytesseract' for m in pkgutil.iter_modules()))
pythonimport pytesseract, PIL.Image as Image img = Image.open('/mnt/data/17644724147097665160860494920548.jpg') text = pytesseract.image_to_string(img) print(text[:2000])
pythonimport pytesseract from PIL import Image, ImageOps, ImageFilter, ImageEnhance img = Image.open('/mnt/data/17644724147097665160860494920548.jpg') img = img.rotate(90, expand=True) # crop region around text maybe center w,h = img.size crop = img.crop((0,h*0.15,w*0.85,h*0.95)) crop = ImageOps.autocontrast(crop) crop = crop.filter(ImageFilter.SHARPEN) text = pytesseract.image_to_string(crop) print(text)
pythonfor angle in [90, 270]: print("ANGLE", angle) t = pytesseract.image_to_string(img.rotate(angle, expand=True)) print(t[:1500])
pythonimg270 = img.rotate(270, expand=True) w,h = img270.size print(w,h) # crop roughly central text region crop = img270.crop((int(w*0.1), int(h*0.1), int(w*0.9), int(h*0.75))) crop = ImageOps.autocontrast(crop) crop = crop.filter(ImageFilter.SHARPEN) text = pytesseract.image_to_string(crop) print(text[:2000])
pythontext_full = pytesseract.image_to_string(img270) print(text_full)
pythonimg = Image.open('/mnt/data/17644724147097665160860494920548.jpg') # try different crops on original orientation print(img.size) for i,box in enumerate([ (0,0,img.size[0], img.size[1]//2), (0,img.size[1]//4, img.size[0], 3*img.size[1]//4), (img.size[0]//4,0,3*img.size[0]//4, img.size[1]//2), ]): crop = img.crop(box) text = pytesseract.image_to_string(crop) print("CROP", i, "TEXT:\n", text[:1000], "\n---")
pythonimg270 = img.rotate(270, expand=True) print(img270.size) for i,box in enumerate([ (0,0,img270.size[0], img270.size[1]//2), (0,img270.size[1]//4, img270.size[0], 3*img270.size[1]//4), (img270.size[0]//4,0,3*img270.size[0]//4, img270.size[1]//2), ]): crop = img270.crop(box) crop = ImageOps.autocontrast(crop) crop = crop.filter(ImageFilter.SHARPEN) text = pytesseract.image_to_string(crop) print("CROP", i, "TEXT:\n", text[:2000], "\n---")
pythonimg90 = img.rotate(90, expand=True) print(img90.size) for i,box in enumerate([ (0,0,img90.size[0], img90.size[1]//2), (0,img90.size[1]//4, img90.size[0], 3*img90.size[1]//4), (img90.size[0]//4,0,3*img90.size[0]//4,img90.size[1]//2), ]): crop = img90.crop(box) crop = ImageOps.autocontrast(crop) crop = crop.filter(ImageFilter.SHARPEN) text = pytesseract.image_to_string(crop) print("CROP", i, "TEXT:\n", text[:2000], "\n---")
pythonfrom PIL import Image, ImageOps, ImageFilter img = Image.open('/mnt/data/17644724147097665160860494920548.jpg') img90 = img.rotate(90, expand=True) # Zoom in area where statement is presumably right side; We'll crop right half of image (since statement text is right side). w,h = img90.size print(w,h) crop = img90.crop((w//2, 0, w, h//2)) # top-right quadrant crop = crop.resize((crop.size[0]*2, crop.size[1]*2), Image.LANCZOS) crop = ImageOps.autocontrast(crop) crop = crop.filter(ImageFilter.SHARPEN) text = pytesseract.image_to_string(crop) print(text[:2000])
pythoncrop = img90.crop((w//4, 0, w, h//2)) crop = crop.resize((crop.size[0]*2, crop.size[1]*2)) crop = ImageOps.autocontrast(crop) crop = crop.filter(ImageFilter.SHARPEN) text = pytesseract.image_to_string(crop) print(text[:2000])
pythonimg180 = img.rotate(180, expand=True) text = pytesseract.image_to_string(img180) print(text[:2000])
pythondef brute(nums,k,l,r): kk=abs(k) # BFS min operations to equalize; but n small; we implement analytic method. sub=nums[l:r+1] # operations ±k; we reason: if difference of any pair not divisible by k -> -1 for i in range(len(sub)): for j in range(len(sub)): if (sub[i]-sub[j])%kk!=0: return -1 rem = ((sub[0]%kk)+kk)%kk if any(((x%kk)+kk)%kk!=rem for x in sub): return -1 # map to q qs=[(x-rem)//kk for x in sub] # compute best t integer; brute. best=None for t in range(min(qs)-5,max(qs)+6): cost=sum(abs(x-t) for x in qs) if best is None or cost<best: best=cost return best def analytic(nums,k,l,r): kk=abs(k) n=len(nums) # rem & q as described rem=[((x%kk)+kk)%kk
python# Let's implement persistent segtree as in C++ design, but in Python, # and test against analytic() which already matches brute(). class PST: def __init__(self, values): self.vals=sorted(set(values)) self.m=len(self.vals) self.seg=[(0,0,0,0)] # (l,r,cnt,sum) self.root=[0] def _new_node(self, base): self.seg.append(self.seg[base]) return len(self.seg)-1 def build_from_array(self, arr): # arr: list of q's pos=[self.vals.index(v)+1 for v in arr] # O(n^2) but fine for small test; C++ uses lower_bound for v,p in zip(arr,pos): newroot=self._update(self.root[-1],1,self.m,p,v) self.root.append(newroot) return pos def _update(self, prev, s,e,pos,val): cur=self._new_node(prev) l,r,cnt,sumv=self.seg[cur] if s==e: cnt+=1 sumv+=val self.seg[cur]=(l,r,cnt,sumv) return cur mid=(s+e)//2 if pos<=mid: newL=self._update(l,s,mid,pos,val) l=newL else: newR=self._update(r,mid+1,e,pos,val) r=newR cnt = self.seg[l][2] + self.seg[r][2] sumv = self.seg[l][3] + self.seg[r][3] self.seg[cur]=(l,r,cnt,sumv) return cur def kth(self, ru,rv,k): return self._kth(ru,rv,1,self.m,k) def _kth(self,u,v,s,e,k): if s==e: return s lu,ru=self.seg[u][0], self.seg[u][1] lv,rv_=self.seg[v][0], self.seg[v][1] leftCnt=self.seg[lu][2]-self.seg[lv][2] mid=(s+e)//2 if k<=leftCnt: return self._kth(lu,lv,s,mid,k) else: return self._kth(ru,rv_,mid+1,e,k-leftCnt) def range(self,ru,rv,L,R): return self._range(ru,rv,1,self.m,L,R) def _range(self,u,v,s,e,L,R): if R<s or e<L: return (0,0) lu,ru,cntu,sumu=self.seg[u] lv,rv_,cntv,sumv=self.seg[v] if L<=s and e<=R: return (cntu-cntv, sumu-sumv) mid=(s+e)//2 a=self._range(lu,lv,s,mid,L,R) b=self._range(ru,rv_,mid+1,e,L,R) return (a[0]+b[0], a[1]+b[1]) def pst_answer(nums,k,l,r): kk=abs(k) rem=[((x%kk)+kk)%kk for x in nums] q=[(x - ((x%kk)+kk)%kk)//kk for x in nums] n=len(nums) pst=PST(q) pst.build_from_array(q) # remainder test via transitions pref=[0]*n for i in range(1,n): pref[i]=pref[i-1]+(rem[i]!=rem[i-1]) if pref[r]-pref[l]>0: return -1 ru=pst.root[r+1]; rv=pst.root[l] length=r-l+1 kpos=(length+1)//2 idx=pst.kth(ru,rv,kpos) med=pst.vals[idx-1] cntL,sumL=pst.range(ru,rv,1,idx) cntT,sumT=pst.range(ru,rv,1,pst.m) cntR=cntT-cntL; sumR=sumT-sumL return med*cntL - sumL + sumR - med*cntR random.seed(1) for n in range(1,8): for _ in range(80): k=random.randint(1,10) nums=[random.randint(-20,20) for __ in range(n)] pst_helper=pst_answer for __ in range(8): l=random.randint(0,n-1) r=random.randint(l,n-1) b=brute(nums,k,l,r) a=pst_answer(nums,k,l,r) if a!=b: print("Mismatch!!!",n,k,nums,l,r,b,a) raise SystemExit print("Persistent segtree logic verified!")
pythondef solution(nums,k,queries): n=len(nums) ans=[0]*len(queries) if k==0: pref=[0]*n for i in range(1,n): pref[i]=pref[i-1]+(nums[i]!=nums[i-1]) for qi,(l,r) in enumerate(queries): if pref[r]-pref[l]>0: ans[qi]=-1 else: ans[qi]=0 return ans kk=abs(k) rem=[((x%kk)+kk)%kk for x in nums] q=[(x - ((x%kk)+kk)%kk)//kk for x in nums] # build transitions prefix pref=[0]*n for i in range(1,n): pref[i]=pref[i-1]+(rem[i]!=rem[i-1]) class PST: def __init__(self,values): self.vals=sorted(set(values)) self.m=len(self.vals) self.seg=[(0,0,0,0)] self.root=[0]*(n+1) def _clone(self,base): self.seg.append(self.seg[base]) return len(self.seg)-1 def update(self,prev,s,e,pos,val): cur=self._clone(prev) l,r,cnt,sumv=self.seg[cur] if s==e: cnt+=1; sumv+=val; self.seg[cur]=(l,r,cnt,sumv); return cur mid=(s+e)//2 if pos<=mid: newL=self.update(l,s,mid,pos,val); l=newL else: newR=self.update(r,mid+1,e,pos,val); r=newR cnt=self.seg[l][2]+self.seg[r][2] sumv=self.seg[l][3]+self.seg[r][3] self.seg[cur]=(l,r,cnt,sumv); return cur def kth(self,ru,rv,k): return self._kth(ru,rv,1,self.m,k) def _kth(self,u,v,s,e,k): if s==e: return s lu,ru=self.seg[u][0], self.seg[u][1] lv,rv_=self.seg[v][0], self.seg[v][1] leftCnt=self.seg[lu][2]-self.seg[lv][2] mid=(s+e)//2 if k<=leftCnt: return self._kth(lu,lv,s,mid,k) else: return self._kth(ru,rv_,mid+1,e,k-leftCnt) def range(self,ru,rv,L,R): return self._range(ru,rv,1,self.m,L,R) def _range(self,u,v,s,e,L,R): if R<s or e<L: return (0,0) lu,ru,cntu,sumu=self.seg[u] lv,rv_,cntv,sumv=self.seg[v] if L<=s and e<=R: return (cntu-cntv, sumu-sumv) mid=(s+e)//2 a=self._range(lu,lv,s,mid,L,R) b=self._range(ru,rv_,mid+1,e,L,R) return (a[0]+b[0], a[1]+b[1]) pst=PST(q) # coordinate positions vals=pst.vals pos=[vals.index(v)+1 for v in q] root=[0]*(n+1) for i in range(1,n+1): root[i]=pst.update(root[i-1],1,pst.m,pos[i-1],q[i-1]) pst.root=root for qi,(l,r) in enumerate(queries): if pref[r]-pref[l]>0: ans[qi]=-1; continue length=r-l+1 if length==1: ans[qi]=0; continue kpos=(length+1)//2 ru=root[r+1]; rv=root[l] idx=pst.kth(ru,rv,kpos); med=vals[idx-1] cntL,sumL=pst.range(ru,rv,1,idx) cntT,sumT=pst.range(ru,rv,1,pst.m) cntR=cntT-cntL; sumR=sumT-sumL res=med*cntL-sumL+sumR-med*cntR ans[qi]=res return ans print(solution([1,4,7],3,[(0,1),(0,2)]))
Here’s a C++ solution for “Q4. Minimum Operations to Equalize Subarrays”.
Idea in short:
[l, r] to be equalizable using ±k:
k.nums[i] = k * q[i] + rem (same rem).
nums[i] to reach target T = k * t + rem is |q[i] - t|.q[i]’s equal, and the minimum sum of |q[i] - t| is achieved at the median of q[i].nums[l..r] have the same remainder modulo k.q[i] = (nums[i] - rem)/k in that range.q[i] values:
[l, r] in O(log n).Complexities:
O(n log n)O(log n)cpp#include <bits/stdc++.h> using namespace std; class Solution { public: struct Node { int l = 0, r = 0; // children indices in seg int cnt = 0; // how many numbers in this range long long sum = 0; // sum of numbers in this range }; vector<Node> seg; // persistent segment tree nodes int M; // number of distinct q-values // Build/update: return new root index based on previous root int update(int prev, int s, int e, int pos, long long val) { int cur = (int)seg.size(); seg.push_back(seg[prev]); // clone previous node if (s == e) { seg[cur].cnt += 1; seg[cur].sum += val; return cur; } int mid = (s + e) >> 1; if (pos <= mid) { int newL = update(seg[prev].l, s, mid, pos, val); seg[cur].l = newL; } else { int newR = update(seg[prev].r, mid + 1, e, pos, val); seg[cur].r = newR; } seg[cur].cnt = seg[seg[cur].l].cnt + seg[seg[cur].r].cnt; seg[cur].sum = seg[seg[cur].l].sum + seg[seg[cur].r].sum; return cur; } // k-th smallest value index in range using roots u (R) and v (L-1) int kth(int u, int v, int s, int e, int k) { if (s == e) return s; int lu = seg[u].l, ru = seg[u].r; int lv = seg[v].l, rv = seg[v].r; int leftCnt = seg[lu].cnt - seg[lv].cnt; int mid = (s + e) >> 1; if (k <= leftCnt) return kth(lu, lv, s, mid, k); return kth(ru, rv, mid + 1, e, k - leftCnt); } // (count, sum) of values whose indices are within [L, R] pair<long long,long long> rangeQuery(int u, int v, int s, int e, int L, int R) { if (R < s || e < L) return {0, 0}; if (L <= s && e <= R) { long long cnt = seg[u].cnt - seg[v].cnt; long long sum = seg[u].sum - seg[v].sum; return {cnt, sum}; } int mid = (s + e) >> 1; auto left = rangeQuery(seg[u].l, seg[v].l, s, mid, L, R); auto right = rangeQuery(seg[u].r, seg[v].r, mid + 1, e, L, R); return {left.first + right.first, left.second + right.second}; } vector<long long> minOperationsToEqualizeSubarrays(vector<int>& nums, int k, vector<vector<int>>& queries) { int n = (int)nums.size(); vector<long long> ans(queries.size()); // Special case k == 0: elements cannot change at all if (k == 0) { if (n == 0) return ans; vector<int> prefBad(n, 0); for (int i = 1; i < n; ++i) { prefBad[i] = prefBad[i - 1] + (nums[i] != nums[i - 1]); } for (int qi = 0; qi < (int)queries.size(); ++qi) { int l = queries[qi][0]; int r = queries[qi][1]; if (prefBad[r] - prefBad[l] > 0) ans[qi] = -1; else ans[qi] = 0; } return ans; } long long kk = llabs((long long)k); // make step positive // rem[i] = nums[i] mod k (normalized to [0, kk-1]) // q[i] = (nums[i] - rem[i]) / k vector<int> rem(n); vector<long long> q(n); for (int i = 0; i < n; ++i) { long long v = nums[i]; long long mod = v % kk; if (mod < 0) mod += kk; // normalize rem[i] = (int)mod; q[i] = (v - mod) / kk; } // prefix array that counts transitions of remainder // if any rem changes inside [l, r], impossible vector<int> prefBad(n, 0); for (int i = 1; i < n; ++i) { prefBad[i] = prefBad[i - 1] + (rem[i] != rem[i - 1]); } // Coordinate-compress q-values vector<long long> vals = q; sort(vals.begin(), vals.end()); vals.erase(unique(vals.begin(), vals.end()), vals.end()); M = (int)vals.size(); vector<int> pos(n); for (int i = 0; i < n; ++i) { pos[i] = int(lower_bound(vals.begin(), vals.end(), q[i]) - vals.begin()) + 1; // 1-based } // Build persistent segment tree over q seg.clear(); seg.reserve((n + 5) * 20); // rough upper bound seg.push_back(Node()); // node 0: empty vector<int> root(n + 1, 0); for (int i = 1; i <= n; ++i) { root[i] = update(root[i - 1], 1, M, pos[i - 1], q[i - 1]); } // Answer queries for (int qi = 0; qi < (int)queries.size(); ++qi) { int l = queries[qi][0]; int r = queries[qi][1]; // Check all nums[l..r] ≡ same (mod k) if (prefBad[r] - prefBad[l] > 0) { ans[qi] = -1; continue; } int len = r - l + 1; if (len == 1) { // single element already equal ans[qi] = 0; continue; } int kpos = (len + 1) / 2; // position of lower median int rootR = root[r + 1]; int rootL = root[l]; // find index of median in compressed coords int idxMed = kth(rootR, rootL, 1, M, kpos); long long medVal = vals[idxMed - 1]; // sum & count of elements <= median auto left = rangeQuery(rootR, rootL, 1, M, 1, idxMed); long long cntLeft = left.first; long long sumLeft = left.second; // total sum & count in [l, r] auto whole = rangeQuery(rootR, rootL, 1, M, 1, M); long long cntTotal = whole.first; // should equal len long long sumTotal = whole.second; long long cntRight = cntTotal - cntLeft; long long sumRight = sumTotal - sumLeft; long long cost = medVal * cntLeft - sumLeft + sumRight - medVal * cntRight; ans[qi] = cost; } return ans; } };
You can drop this straight into the LeetCode editor and just adjust the function name/signature if their stub is slightly different.