3741. 三个相等元素之间的最小距离 II
This commit is contained in:
parent
8cac824082
commit
444863b22d
76
src/main.rs
76
src/main.rs
|
|
@ -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]]"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue