wa 38 39 40 这三个答案为 No 的点
#pragma GCC optimize(3, "Ofast", "inline", "unroll-loops")
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1000010;
const int inf = 1e18;
int l[N], r[N], f[N], vis[N], vis2[N];
int to_l[N], to_r[N];
inline int calc(int l, int r)
{
if ((r - l + 1) & 1)
return 0;
int len = r - l + 1, ll = l;
int mid = l + len / 2;
while (mid <= r)
{
if (to_r[l] && to_r[l] != mid)
return 0;
if (to_l[mid] && to_l[mid] != l)
return 0;
if (to_l[mid] && to_r[l] && vis[l] != -vis[mid])
return 0;
if (vis[l] < 0 || vis[mid] > 0)
return 0;
++l, ++mid;
}
for (int i = ll; i <= r; ++i)
if ((to_l[i] && to_l[i] < ll) || to_r[i] > r)
return 0;
return 1;
}
signed main()
{
cin.tie(0)->sync_with_stdio(false);
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> l[i] >> r[i];
if (~l[i])
{
if (vis[l[i]])
{
cout << "No\n";
return 0;
}
vis[l[i]] = i;
}
if (~r[i])
{
if (vis[r[i]])
{
cout << "No\n";
return 0;
}
vis[r[i]] = -i;
}
if (~l[i] && ~r[i])
{
if (l[i] >= r[i])
{
cout << "No\n";
return 0;
}
if (!to_l[r[i]])
to_l[r[i]] = l[i];
else
to_l[r[i]] = min(to_l[r[i]], l[i]);
if (!to_r[l[i]])
to_r[l[i]] = r[i];
else
to_r[l[i]] = max(to_r[l[i]], r[i]);
}
}
f[0] = 1;
for (int i = 1; i <= n * 2; ++i)
for (int j = 1; j <= i; ++j)
if (f[j - 1] && calc(j, i))
{
f[i] = 1;
break;
}
// cerr << "f: ";
// for (int i = 1; i <= n * 2; ++i)
// cerr << f[i] << ' ';
// cerr << '\n';
cout << (f[n * 2] ? "Yes" : "No") << '\n';
return 0;
}