\(\mathcal{Description}\)

  Link.

  给定 \(n\) 阶排列 \(a\),\(q\) 次询问,每次给出 \(1\le l_1\le r_1<l_2\le r_2\le n\) 且 \(r_1-l_1=r_2-l_2\),询问满足 \(\forall j\in[1,r_1-l_1+1],~a_{j+l_1-1}<a_{b_j+l_2-1}\) 的 \((r_1-l_1+1)\) 阶排列 \(b\) 的个数,模 \((10^9+7)\)。

  多测,\(\sum n,\sum q\le10^5\),\(a\) 的逆序对数 \(\le10^5\)。

\(\mathcal{Solution}\)

  暴力做法:设前后询问区间为 \(A\) 和 \(B\),把两个区间的元素丢一起升序排序,则每个 \(A\) 中元素选择匹配点的方案数为其后方 \(B\) 类元素个数减去 \(A\) 类元素个数。

  将同属一类的连续元素视为一段,那么有结论:段数为 \(\mathcal O(\sqrt n)\) 级别。

每个 \(B\) 段与后方所有 \(A\) 段组成逆序对,故段数与逆序对数是平方关系,而逆序对数是 \(\mathcal O(n)\) 级别,故段数 \(\mathcal O(\sqrt n)\) 级别。

  利用主席数查找前驱快速求出每段长度,即可 \(\mathcal O(n\log n+q\sqrt n\log n)\) 求解。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 1e5, MOD = 1e9 + 7;
int n, q, root[MAXN + 5], fac[MAXN + 5], ifac[MAXN + 5]; inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int mul( const long long a, const int b ) { return int( a * b % MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
inline int mpow( int a, int b ) {
int ret = 1;
for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
return ret;
} inline void init() {
fac[0] = 1;
rep ( i, 1, MAXN ) fac[i] = mul( i, fac[i - 1] );
ifac[MAXN] = mpow( fac[MAXN], MOD - 2 );
per ( i, MAXN - 1, 0 ) ifac[i] = mul( i + 1, ifac[i + 1] );
} struct SegmentTree {
static const int MAXND = 2e6;
int node, ch[MAXND][2], sum[MAXND]; inline void insert( int& u, const int l, const int r, const int x ) {
int v = u, mid = l + r >> 1; u = ++node;
ch[u][0] = ch[v][0], ch[u][1] = ch[v][1], sum[u] = sum[v] + 1;
if ( l == r ) return ;
if ( x <= mid ) insert( ch[u][0], l, mid, x );
else insert( ch[u][1], mid + 1, r, x );
} inline int count( const int u, const int v, const int l, const int r,
const int ql, const int qr ) {
if ( !v ) return 0;
if ( ql <= l && r <= qr ) return sum[v] - sum[u];
int mid = l + r >> 1, ret = 0;
if ( ql <= mid ) ret += count( ch[u][0], ch[v][0], l, mid, ql, qr );
if ( mid < qr ) ret += count( ch[u][1], ch[v][1], mid + 1, r, ql, qr );
return ret;
} inline int prefix( const int u, const int v, const int l, const int r,
const int x ) {
if ( !x || sum[v] <= sum[u] ) return 0;
if ( l == r ) return l;
int mid = l + r >> 1;
if ( x <= mid ) return prefix( ch[u][0], ch[v][0], l, mid, x );
if ( int t = prefix( ch[u][1], ch[v][1], mid + 1, r, x ); t ) return t;
return prefix( ch[u][0], ch[v][0], l, mid, x );
}
} sgt; int main() {
freopen( "god.in", "r", stdin );
freopen( "god.out", "w", stdout ); int T; init();
for ( scanf( "%d", &T ); T--; sgt.node = 0 ) {
scanf( "%d %d", &n, &q );
rep ( i, 1, n ) {
int t; scanf( "%d", &t );
sgt.insert( root[i] = root[i - 1], 1, n, t );
} for ( int l1, r1, l2, r2; q--; ) {
scanf( "%d %d %d %d", &l1, &r1, &l2, &r2 );
int rt1[] = { root[l1 - 1], root[r1] },
rt2[] = { root[l2 - 1], root[r2] };
int mxl = sgt.prefix( rt1[0], rt1[1], 1, n, n ),
mxr = sgt.prefix( rt2[0], rt2[1], 1, n, n ), cnt = 0, ans = 1;
while ( mxl || mxr ) {
if ( mxl < mxr ) {
int lef = sgt.prefix( rt1[0], rt1[1], 1, n, mxr ),
len = sgt.count( rt2[0], rt2[1], 1, n, lef, mxr );
cnt += len;
mxr = sgt.prefix( rt2[0], rt2[1], 1, n, lef );
} else {
int lef = sgt.prefix( rt2[0], rt2[1], 1, n, mxl ),
len = sgt.count( rt1[0], rt1[1], 1, n, lef, mxl );
if ( cnt < len ) { ans = 0; break; }
ans = mul( ans, mul( fac[cnt], ifac[cnt - len] ) );
cnt -= len;
mxl = sgt.prefix( rt1[0], rt1[1], 1, n, lef );
}
}
printf( "%d\n", ans );
}
}
return 0;
}

Solution -「多校联训」神的更多相关文章

  1. Solution -「多校联训」最小点覆盖

    \(\mathcal{Description}\)   Link.   求含有 \(n\) 个结点的所有有标号简单无向图中,最小点覆盖为 \(m\) 的图的数量的奇偶性.\(T\) 组数据.   \( ...

  2. Solution -「多校联训」排水系统

    \(\mathcal{Description}\)   Link.   在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...

  3. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  4. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...

  5. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  6. Solution -「多校联训」消失的运算符

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...

  7. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  8. Solution -「多校联训」古老的序列问题

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...

  9. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

随机推荐

  1. vue - 指令创建 vue工程

    1.在需要创建工程的文件夹里打开cmd 执行 vue -V 看看版本号是否正常, 创建工程 vue create [工程名称] 如:vue create mytestvue 然后会弹出选择 按方向键, ...

  2. PyCharm - 关联mysql失败 - Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.

    时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时. 所以要修改mysql的时长 在mysql的命令模式下,输入: set global time_zone='+8:00'; 再次连接成 ...

  3. js获取设备内网ip

    可以直接使用,不需要导入其他配置 看代码 1 <script> 2 //获取内网ip 3 var RTCPeerConnection = window.RTCPeerConnection ...

  4. SYCOJ4972的幂次方

    题目- 2的幂次方 (shiyancang.cn) 递归题 #include<bits/stdc++.h> using namespace std; int k; void f(int n ...

  5. sql创建表格时出现乱码

    1.新建数据库时,第一次只填写了数据库名称保存数据库,如下图: 2.创建一个Student表格,代码如下,其中有数据有中文,创建完后查看表格数据,发现中文为乱码 create table Studen ...

  6. HIVE执行引擎TEZ学习以及实际使用

    概述 最近公司在使用Tez,今天写一篇关于Tez的学习和使用随笔.Tez是Apache最新的支持DAG作业的开源计算框架,它可以将多个有依赖的作业转换为一个作业从而大幅提升DAG作业的性能.Tez并不 ...

  7. Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SD卡TF卡读写

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  8. 带你玩转Flink流批一体分布式实时处理引擎

    摘要:Apache Flink是为分布式.高性能的流处理应用程序打造的开源流处理框架. 本文分享自华为云社区<[云驻共创]手把手教你玩转Flink流批一体分布式实时处理引擎>,作者: 萌兔 ...

  9. 【记录一个问题】redis中执行事务出现错误“EXECABORT Transaction discarded because of previous errors”

    执行事务的大致代码如下: redisClient := GetRedisClient() pipe := redisClient.TxPipeline() err := pipe.ZAdd(k, ar ...

  10. gin框架中使用jwt

    生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...