rt,只对了#1, #6, #11~13
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
struct Node
{
int x, y, z;
int h; double f;
}a[N];
int c1[N], h1[N], h2[N];
double c2[N], f1[N], f2[N];
bool cmp1(Node x, Node y)
{return x.x != y.x ? x.x > y.x : (x.y != y.y ? x.y > y.y : x.z < y.z); }
bool cmp2(Node x, Node y)
{return x.x != y.x ? x.x < y.x : (x.y != y.y ? x.y < y.y : x.z < y.z); }
bool cmp3(Node x, Node y) {return x.y > y.y; }
bool cmp4(Node x, Node y) {return x.y < y.y; }
int lbt(int x) {return x & (-x); }
void update(int x, int h, double f)
{
while(x < N)
{
if(c1[x] < h) c1[x] = h, c2[x] = f;
else if(c1[x] == h) c2[x] += f;
x += lbt(x);
}
}
int ask1(int x)
{
int ans = 0;
while(x)
ans = max(ans, c1[x]), x -= lbt(x);
return ans;
}
double ask2(int x, int h)
{
double ans = 0;
while(x)
{
if(c1[x] == h) ans += c2[x];
x -= lbt(x);
}
return ans;
}
void del(int x)
{
while(x < N)
c1[x] = 0, c2[x] = 0, x += lbt(x);
}
bool check(int x, int y, int op)
{return op == 1 ? a[x].y >= a[y].y : a[x].y <= a[y].y; }
void merge(int l, int r, int op)
{
int mid = l + r >> 1;
int i = l, j = mid + 1;
while(i <= mid && j <= r)
{
if(check(i, j, op))
{update(a[i].z, a[i].h, a[i].f); i ++; }
else
{
int v = ask1(a[j].z) + 1;
if(a[j].h < v)
{a[j].h = v; a[j].f = ask2(a[j].z, v - 1); }
else if(a[j].h == v)
a[j].f == ask2(a[j].z, v - 1);
j ++;
}
}
for(; j <= r; j ++)
{
int v = ask1(a[j].z) + 1;
if(a[j].h < v)
{a[j].h = v; a[j].f = ask2(a[j].z, v - 1); }
else if(a[j].h == v)
a[j].f += ask2(a[j].z, v - 1);
}
for(int k = l; k < i; k ++) del(a[k].z);
return;
}
void cdq(int l, int r, int op)
{
if(l == r) return;
int mid = l + r >> 1;
cdq(l, mid, op);
if(op == 1)
sort(a + l, a + mid + 1, cmp3), sort(a + mid + 1, a + r + 1, cmp3);
else
sort(a + l, a + mid + 1, cmp4), sort(a + mid + 1, a + r + 1, cmp4);
merge(l, r, op);
if(op == 1)
sort(a + mid + 1, a + r + 1, cmp1);
else sort(a + mid + 1, a + r + 1, cmp2);
cdq(mid + 1, r, op);
}
int main()
{
int n; scanf("%d", &n);
for(int i = 1; i <= n; i ++)
{
scanf("%d%d", &a[i].x, &a[i].y); a[i].z = i;
a[i].h = 1; a[i].f = 1;
}
sort(a + 1, a + n + 1, cmp1);
cdq(1, n, 1);
int ans = 0;
for(int i = 1; i <= n; i ++)
h1[a[i].z] = a[i].h, f1[a[i].z] = a[i].f,
ans = max(ans, h1[a[i].z]);
for(int i = 1; i <= n; i ++)
{a[i].z = n - a[i].z + 1; a[i].f = 1; a[i].h = 1;}
sort(a + 1, a + n + 1, cmp2);
cdq(1, n, 2);
double k = 0;
for(int i = 1; i <= n; i ++)
{
h2[n - a[i].z + 1] = a[i].h,
f2[n - a[i].z + 1] = a[i].f;
if(h2[n - a[i].z + 1] == ans) k += f2[n - a[i].z + 1];
}
for(int i = 1; i <= n; i ++) cout << h1[i] << ' ';
cout << "\n";
for(int i = 1; i <= n; i ++) cout << h2[i] << ' ';
cout << "\n";
for(int i = 1; i <= n; i ++) cout << f1[i] << ' ';
cout << "\n";
for(int i = 1; i <= n; i ++) cout << f2[i] << ' ';
cout << "\n";
cout << ans << "\n";
for(int i = 1; i <= n; i ++)
if(h1[i] + h2[i] - 1 == ans)
printf("%.5lf ", 1.0 * (f1[i] * f2[i]) / k);
else printf("0.00000 ");
}