結果
| 問題 | No.3754 Mischievous Resident (Hard) |
| コンテスト | |
| ユーザー |
テナガザル
|
| 提出日時 | 2026-10-02 23:49:45 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 1,909 bytes |
| 記録 | |
| コンパイル時間 | 1,049 ms |
| コンパイル使用メモリ | 180,504 KB |
| 実行使用メモリ | 9,868 KB |
| 最終ジャッジ日時 | 2026-10-02 23:49:59 |
| 合計ジャッジ時間 | 13,093 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 32 WA * 16 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void solve()
{
const int inf = 1e9;
int n, m;
cin >> n >> m;
vector<int> a(m), b(m);
for (int i = 0; i < m; ++i) cin >> a[i];
for (int i = 0; i < m; ++i) cin >> b[i];
vector<pair<int, int>> ab(m);
for (int i = 0; i < m; ++i) ab[i] = {a[i], b[i]};
sort(ab.begin(), ab.end());
for (int i = 1; i < m; ++i)
{
if (ab[i - 1].second > ab[i].second || (ab[i].first != ab[i - 1].first && ab[i].second == ab[i - 1].second) || (ab[i - 1] == ab[i] && ab[i - 1].first != ab[i - 1].second))
{
cout << -1 << endl;
return;
}
}
auto cal = [](long long l, long long s, long long g, long long r) -> int
{
if (s == g) return 0;
int ret = 0;
while (s < g)
{
++ret;
long long ns = min((s + r) / 2, g);
s = ns;
}
while (s > g)
{
++ret;
long long ns = max((s + l + 1) / 2, g);
s = ns;
}
return ret;
};
auto cal2 = [](long long s1, long long g1, long long g2, long long s2) -> int
{
long long d1 = g2 - g1, d2 = s2 - s1;
int ret = 1;
long long tmp = d2;
while ((tmp + 1) / 2 > d1)
{
++ret;
tmp = (tmp + 1) / 2;
}
if (min(g1 - s1, s2 - g2) < tmp - d1) ++ret;
return max(2, ret);
};
int ans = 0;
if (ab[0].first > ab[0].second) ++ans;
if (ab[m - 1].first < ab[m - 1].second) ++ans;
for (int i = 0; i + 1 < m; ++i)
{
if (ab[i].first < ab[i].second)
{
if (ab[i + 1].first > ab[i + 1].second) ans += cal2(ab[i].first, ab[i].second, ab[i + 1].second, ab[i + 1].first);
else ans += cal(-inf, ab[i].first, ab[i].second, ab[i + 1].second);
}
else if (ab[i + 1].first > ab[i + 1].second) ans += cal(ab[i].second, ab[i + 1].first, ab[i + 1].second, inf + inf);
}
cout << ans << endl;
}
int main()
{
int t;
cin >> t;
while (t--) solve();
}
テナガザル