結果
問題 |
No.1917 LCMST
|
ユーザー |
|
提出日時 | 2025-07-16 13:49:54 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 518 ms / 4,000 ms |
コード長 | 3,875 bytes |
コンパイル時間 | 12,596 ms |
コンパイル使用メモリ | 400,272 KB |
実行使用メモリ | 76,800 KB |
最終ジャッジ日時 | 2025-07-16 13:50:30 |
合計ジャッジ時間 | 25,826 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 42 |
コンパイルメッセージ
warning: unused variable: `n` --> src/main.rs:116:12 | 116 | fn new(n:usize)->E{ | ^ help: if this is intentional, prefix it with an underscore: `_n` | = note: `#[warn(unused_variables)]` on by default
ソースコード
#![allow(unused_imports,non_snake_case,dead_code)] use std::{cmp::Reverse as Rev,ops::Range,collections::*,iter::*}; use proconio::{marker::*,*}; // LCMST #[fastout] fn main(){ input!{ n:usize, mut a:[usize;n], } a.sort_unstable(); let mut ans=0; a.dedup_by(|a,b|a==b && {ans+=*a; true}); let n=a.len(); let maxA=1e6 as usize+5; let e=E::new(maxA); let divs=(0..n).map(|i|e.divisor(a[i])).collect::<Vec<_>>(); let mut id_to_div=divs.iter().flatten().copied().collect::<Vec<_>>(); id_to_div.sort_unstable(); id_to_div.dedup(); let mut div_to_id=vec![!0;maxA]; for i in 0..id_to_div.len(){ div_to_id[id_to_div[i]]=i; } let ds=id_to_div.len(); let mut que=vec![!0;ds]; let mut co_que=vec![vec![];ds]; let mut seen=vec![false;n]; for i in (1..n).rev(){ for &d in &divs[i]{ let id=div_to_id[d]; co_que[id].push(i); } } seen[0]=true; let mut min=BTreeSet::new(); for &d in &divs[0]{ let id=div_to_id[d]; que[id]=que[id].min(a[0]); if !co_que[id].is_empty(){ let m0=que[id]; let m1=a[*co_que[id].last().unwrap()]; let w=m0/d*m1; min.insert((w,id)); } } // eprintln!("{:?}",min); for _ in 1..n{ // eprintln!("============= before ============="); // eprintln!("{:?}",que); // eprintln!("{:?}",co_que); // eprintln!("{:?}",min); let (w,id)=min.first().unwrap(); ans+=*w as usize; let new=*co_que[*id].last().unwrap(); // eprintln!("{w}: {} {}",que[*id],a[new]); seen[new]=true; for &d in &divs[new]{ let id=div_to_id[d] as usize; if que[id]!=!0 && !co_que[id].is_empty(){ let cur=que[id]/d*a[*co_que[id].last().unwrap()]; let f=min.remove(&(cur,id)); assert!(f); } que[id]=que[id].min(a[new]); while let Some(&v)=co_que[id].last(){ if seen[v]{ co_que[id].pop().unwrap(); } else{ break; } } if !co_que[id].is_empty(){ let m0=que[id]; let m1=a[*co_que[id].last().unwrap()]; let w=m0/d*m1; min.insert((w,id)); } } // eprintln!(); // eprintln!("============= after ============="); // eprintln!("{:?}",que); // eprintln!("{:?}",co_que); // eprintln!("{:?}",min); // eprintln!(); // eprintln!(); // eprintln!(); } println!("{ans}"); } struct E{ a:Vec<usize>, } impl E{ fn new(n:usize)->E{ let mut a=vec![!0;1e6 as usize+5]; for i in 2..a.len(){ if a[i]!=!0{ continue; } for j in 1..{ if a.len()<=i*j{ break; } a[i*j]=i; } } E{a} } fn divisor(&self,mut n:usize)->Vec<usize>{ let mut ps=vec![]; while self.a[n]!=!0{ let p=self.a[n]; let mut cnt=0; while n%p==0{ cnt+=1; n/=p; } ps.push((p,cnt)); } if n!=1{ ps.push((n,1)); } fn rec(ps:&[(usize,usize)],i:usize,mut div:usize,divs:&mut Vec<usize>){ if i==!0{ divs.push(div); return; } let (p,cnt)=ps[i]; for _ in 0..=cnt{ rec(ps,i-1,div,divs); div*=p; } } let mut divs=vec![]; rec(&ps,ps.len()-1,1,&mut divs); divs } }