const int N = 210;
int n, a[N], p[N], c[3], st[N][N][N];
void dfs(int i, int maxv, int minv)
{
if (maxv >= 2 * minv) return ;
if (i == n + 1) return st[c[0]][c[1]][c[2]] = 1, void();
c[a[i]] ++ ; dfs(i + 1, max(maxv, p[i]), min(minv, p[i]));
c[a[i]] -- ; dfs(i + 1, maxv, minv);
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d%d", &a[i], &p[i]);
dfs(1, 0, 1e9); int res = 0;
for (int i = 0; i <= n; i ++ ) for (int j = 0; j <= n; j ++ ) for (int k = 0; k <= n; k ++ ) if (st[i][j][k]) res ++ ;
printf("%d\n", res); return 0;
}
const int N = 210;
typedef long long LL;
typedef pair<int, pair<int, int> > PIII;
int n;
struct Nd { int x, y; bool operator < (const Nd& t) const { return y < t.y; } } a[N];
int c[N][3]; LL res;
PIII s[N]; int cnt;
int S[N][N][N];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d%d", &a[i].x, &a[i].y); sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i ++ )
{
for (int j = 0; j < 3; j ++ ) c[i][j] = c[i - 1][j];
c[i][a[i].x] ++ ;
}
for (int i = 1; i <= n; i ++ )
{
int l = i, r = n;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (a[mid].y < a[i].y * 2) l = mid;
else r = mid - 1;
} // 选 i
if (a[l].y < a[i].y * 2)
s[ ++ cnt] = make_pair(c[l][0] - c[i - 1][0], make_pair(c[l][1] - c[i - 1][1], c[l][2] - c[i - 1][2]));
}
sort(s + 1, s + 1 + cnt);
// for (int i = 1; i <= cnt; i ++ ) cout << s[i].first << ' ' << s[i].second.first << ' ' << s[i].second.second << '\n';
for (int i = 1; i <= cnt; i ++ ) for (int j = 0; j <= s[i].first; j ++ )
for (int k = 0; k <= s[i].second.first; k ++ ) for (int p = 0; p <= s[i].second.second; p ++ )
S[j][k][p] = 1;
for (int i = 0; i <= n; i ++ ) for (int j = 0; j <= n; j ++ ) for (int k = 0; k <= n; k ++ )
if (S[i][j][k]) res ++ ;
printf("%lld\n", res);
return 0;
}
这两段代码看起来都将所有可行解遍历了一遍,但是好像前一段是指数级的,后一段是多项式的,搞不懂为什么会有复杂度差异?