3741. 三个相等元素之间的最小距离 II

This commit is contained in:
li_chx 2026-04-10 11:11:11 +08:00
parent 8cac824082
commit 444863b22d
Signed by: li_chx
GPG Key ID: C7CF27EFA1E58BAC
1 changed files with 17 additions and 59 deletions

View File

@ -1,74 +1,32 @@
use crate::arr::make_matrix; use std::collections::HashMap;
mod arr; mod arr;
struct Solution {} struct Solution {}
const MOD: i64 = 1_000_000_007;
fn mod_pow(mut a: i64, mut e: i64) -> i64 {
let mut r = 1i64;
a %= MOD;
while e > 0 {
if (e & 1) == 1 {
r = r * a % MOD;
}
a = a * a % MOD;
e >>= 1;
}
r
}
fn mod_inv(x: i64) -> i64 {
// 仅当 x % MOD != 0 时存在逆元
mod_pow(x, MOD - 2)
}
impl Solution { impl Solution {
pub fn xor_after_queries(nums: Vec<i32>, queries: Vec<Vec<i32>>) -> i32 { pub fn minimum_distance(nums: Vec<i32>) -> i32 {
let mut nums = nums.into_iter().map(|x| x as i64).collect::<Vec<i64>>(); let mut mp = HashMap::<i32, Vec<i32>>::new();
let pivot = queries.len().isqrt(); for i in 0..nums.len() {
let mut diff = vec![vec![1_i64; nums.len() + pivot]; pivot]; if mp.contains_key(&nums[i]) {
for q in &queries { mp.get_mut(&nums[i]).unwrap().push(i as i32);
let [l, r, k, v]: [i32; 4] = q.as_slice().try_into().unwrap();
let k = k as usize;
let l = l as usize;
let r = r as usize;
if k >= pivot {
for i in (l..=r).step_by(k) {
nums[i] = (nums[i] * v as i64) % MOD
}
} else { } else {
diff[k][l] = (diff[k][l] * v as i64) % MOD; mp.insert(nums[i], vec![i as i32]);
let r_idx = r - (r - l) % k + k;
diff[k][r_idx] = (diff[k][r_idx] * mod_inv(v as i64)) % MOD;
} }
} }
for i in 1..pivot { let mut ans = 1e9 as i32;
for j in 0..i { for key in mp.keys() {
for k in (j + i..nums.len() + 1).step_by(i) { let arr = mp.get(key).unwrap();
diff[i][k] = (diff[i][k - i] * diff[i][k]) % MOD; if arr.len() < 3 {
continue;
}
for i in 2..arr.len() {
ans = ans.min(arr[i] - arr[i - 2]);
} }
} }
} if ans == 1e9 as i32 { -1 } else { ans * 2 }
for i in 1..pivot {
for j in 0..nums.len() {
nums[j] = (nums[j] * diff[i][j]) % MOD
}
}
for i in 1..nums.len() {
nums[0] ^= nums[i];
}
nums[0] as i32
} }
} }
fn main() { fn main() {
println!( println!("{:?}", Solution::minimum_distance(vec![1,1,2,3,2,1,2],));
"{:?}",
Solution::xor_after_queries(
vec![562, 62],
make_matrix(
"[[0,1,2,7],[1,1,2,11],[0,1,2,2],[1,1,1,11],[1,1,2,1],[0,0,1,9],[0,1,2,4],[1,1,1,6],[0,0,2,17]]"
)
)
);
} }