为什么会输出大于1的概率?
查看原帖
为什么会输出大于1的概率?
767099
WEXI7111楼主2023/5/16 11:22

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 ");
}
2023/5/16 11:22
加载中...