songhongyi
2024-11-19 19:06:16
题意:给定
求大小为
考虑某个
转化一下,可以变成给定一个
拆开后不难发现,设:
,则
复杂度瓶颈在二维数点和卷积,是
struct Node
{
int v, r;
int id;
} a[ MAXN ];
mint v[ MAXN ];
mint res[ MAXN ];
int main()
{
cin.tie( 0 );
int n;
cin >> n;
init( n );
for ( int i = 1; i <= n; i++ )
{
a[ i ].id = i;
cin >> a[ i ].v;
}
for ( int i = 1; i <= n; i++ )
{
cin >> a[ i ].r;
M = max( M, a[ i ].r + 1 );
}
sort( a + 1, a + n + 1,
[&]( Node a, Node b ) { return ( a.v == b.v ? a.id < b.id : a.v > b.v ); } );
for ( int i = 1; i <= n; i++ )
{
int ct = i - 1 - T.query( a[ i ].v );
if ( a[ i ].r <= a[ i ].v )
{
v[ i - 1 ] += a[ i ].v;
}
else
{
v[ i - 1 ] += a[ i ].v;
v[ ct ] -= a[ i ].v;
}
T.add( a[ i ].r, 1 );
}
T.init();
sort( a + 1, a + n + 1,
[&]( Node a, Node b ) { return ( a.r == b.r ? a.id < b.id : a.r > b.r ); } );
for ( int i = 1; i <= n; i++ )
{
int ct = i - 1 - T.query( a[ i ].r - 1 );
if ( a[ i ].v < a[ i ].r )
{
v[ i - 1 ] += a[ i ].r;
}
else
{
v[ i - 1 ] += a[ i ].r;
v[ ct ] -= a[ i ].r;
}
T.add( a[ i ].v, 1 );
}
vector< mint > f( n + 1 );
vector< mint > g( n + 1 );
for ( int i = 0; i <= n; i++ )
{
f[ i ] = v[ i ] * fac[ i ];
g[ i ] = ifac[ n - i ];
}
vector< mint > h = multiple( f, g );
for ( int i = 0; i < n; i++ )
{
res[ i + 1 ] = h[ i + n ] * ifac[ i ];
}
for ( int i = 1; i <= n; i++ )
{
res[ i ] = res[ i ] * qpow( C( n, i ), pmod - 2 );
cout << raw( res[ i ] ) << " ";
}
cout << endl;
}