結果
| 問題 | No.3680 セグメント釣り |
| コンテスト | |
| ユーザー |
shira111
|
| 提出日時 | 2026-09-05 15:33:59 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0) |
| 結果 |
AC
|
| 実行時間 | 88 ms / 2,000 ms |
| + 440µs | |
| コード長 | 1,388 bytes |
| 記録 | |
| コンパイル時間 | 3,107 ms |
| コンパイル使用メモリ | 351,548 KB |
| 実行使用メモリ | 7,972 KB |
| 最終ジャッジ日時 | 2026-09-05 15:34:08 |
| 合計ジャッジ時間 | 6,475 ms |
|
ジャッジサーバーID (参考情報) |
judge4_0 / judge5_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 13 |
ソースコード
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i < (int)(n); i++)
#define all(c) c.begin(), c.end()
using namespace std;
typedef long long ll; typedef long double ld;
using vi = vector<int>; using vvi = vector<vi>;
using vl = vector<ll>; using vvl = vector<vl>;
using P = pair<ll,ll>;
ll solve() {
//答えはmax120程度
//BFS書けないか? ->断念。どん欲へ
ll sx,sy,tx,ty; cin>>sx>>sy>>tx>>ty;
if(sy > 60 || ty > 60) return abs(sy - ty); //y>60なら左端マスがxの全範囲をカバー
//x座標は左端に寄せる
{
ll dx = 1LL << sy;
sx -= sx % dx;
}
{
ll dx = 1LL << ty;
tx -= tx % dx;
}
//sy > ty
if(sy < ty) swap(sx,tx), swap(sy,ty);
//ゴールから直上に上がるケースを事前に格納
vl gx(61,0); //goal x
{
ll x = tx, y = ty;
ll dx = 1LL<<y;
int d = 0;
while(y <= 60) {
gx[y] = x;
y++;
dx <<= 1;
x -= x % dx;
d++;
}
}
//rep(y,61) cerr<<'('<<gx[y]<<','<<y<<") "; cerr<<endl;
ll ans = 2e18;
//スタートから直上に上がりながらans更新
{
ll x = sx, y = sy;
ll dx = 1LL<<y;
int d = 0;
while(y <= 60) {
ll cur = d + (y-ty) + abs(gx[y] - x) / dx;
ans = min(ans, cur);
y++;
dx <<= 1;
x -= x % dx;
d++;
}
}
return ans;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); //入出力高速化
int T; cin>>T;
rep(i,T) cout<<solve()<<'\n';
}
shira111