Loading...
2025/03/06
6完で+7、まぁDで詰まってしまったとはいえかなり苦しいなぁと思います。一応暖まってはいるらしいですが...
問題文を読むと、
が狭義単調増加であるとはなるすべての整数についてが成り立つことをを指します。
と丁寧に説明されているので、これを愚直に判定すればよいです。提出
use itertools::Itertools; use proconio::input; fn main() { input!{ n: usize, a: [u64; n
概要を読むと、既視感のある図が出てきます。いつだかの回に出てきた気がしますが見つかりません。えーん...
構築法は問題文に乗っていますが、実装ではその回の記憶を元に「外側からの距離」に着目することでで構築をしました。提出
use itertools::{iproduct, Itertools}; use proconio::input; fn main() { input!{ n: usize, }
であるようなであってを満たす場合は、同じ値が無いため条件を満たす連続部分列は存在しません。 同じ値が複数個ある場合、両端が同じ値であるような部分列を取るべきです。よって、各値が直前にいつでてきたか?を保持しておくことで、で求めることができます。
use std::collections::BTreeMap; use proconio::input; pub static INF: u64 = 1e18 as u64; fn main()
難しすぎます。操作の種類2が明らかに大変で、代わりに「巣の位置を入れ替える」という操作を行うことで高速化を図りたいです。しかし、巣の位置を入れ替えてしまうと操作の種類1: 鳩を指定された巣に移動させる、が高速に処理できなくなります2。そこで、新たに仮想indicateを作って管理することで高速にできるようにする、という典型です。
典型なんですが、頭をバグらせてしまい...1ペナでしかもかなりの時間を掛けました... 提出
use itertools::Itertools; use proconio::{input, marker::Usize1}; fn main() { input!{ n: usize,
愚直にグラフを反転する操作をするのは大変なので、代わりに反転済みのグラフを別途用意しておくことを考えます。元のグラフを、反転後のグラフをと呼びます。こうすると、「コストでグラフを反転する」という操作は「各頂点において、とを相互につなぐ重みの辺を貼る」というように言い換えることが可能で、こうすることで問題は頂点からあるいはへの最短経路問題に帰着することができます。 よって、Dijkstra法を用いることでこの問題が解けます。
use std::{cmp::Reverse, collections::BinaryHeap}; use proconio::{input, marker::Usize1}; pub static INF: u64 g
条件を見ると、を定めることでそのような構成が可能か?を判定できそうです。これは、を決めておくとが取りうる範囲がと限定されるからです。 そして、そのような判定が可能であれば、を二分探索してとしてあり得る最大値を求めることでこの問題を解くことができます。 よって、考えるべきは判定問題です。各歯を見たときのの取りうる範囲は前述の通りであり、これに直前の歯の取りうる範囲を組み合わせてandを取ることで、条件を満たすような取り方のうち可能な範囲が撮れるので、判定問題を解くことができました。 よって、でこの問題を解くことができます。
use proconio::input; fn judge(key: i64, x: i64, v: &[(i64, i64)]) -> bool {