\(\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. sqlcl - Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file

    运行sqlcl的命令sql出错 bash-4.2$ sql username/password@hostname:1521:databasename Exception in thread " ...

  2. Ant 调用 Shell/CMD 命令

    Ant中调用Makefile,使用shell中的make命令 <?xml version="1.0" encoding="utf-8" ?> < ...

  3. centos7 alias别名永久生效

    进入/etc/profile.d/目录 cd /etc/profile.d/ 在profile.d目录随意创建一个sh文件,例如alias_test.sh vi alias_test.sh##里面的内 ...

  4. Go语言系列- Socket编程和Redis

    Socket编程 一.socket编程概述 什么是socket编程? socket编程是计算机PC机器上2个程序通过一个双向的通信连接实现数据的交互,这个连接的一端就是一个socket.socket的 ...

  5. MapReduce和Hive学习文档链接学习顺序

    1.<CentOS6.5下安装Hadoop-2.7.3(图解教程)> https://www.toutiao.com/i6627365258090512909/ 2.<CentOS6 ...

  6. webpack 多环境打包

    目前来说有两种方案: 方案一: 1.修改build文件夹下build.js文件 添加声明变量 2.修改config文件夹下dev.env.js文件 这个是开发环境所用版本 3.修改config文件夹下 ...

  7. HDOJ3579Hello Kiki

    https://acm.hdu.edu.cn/showproblem.php?pid=3579 一些坑点.首先是如果说最后求得到的结果为0,那么在数学意义上这是正确的,0对于任何的确是最小的整数解,但 ...

  8. redis 入门使用

     一.Redis 数据类型及结构特点 Redis 最常见的5中数据结构有 String(字符串),List(列表),Set(集合),Hash(散列),Sorted Sets (有序集合),下表简单总结 ...

  9. Kafka connector (kafka核心API)

    前言 Kafka Connect是一个用于将数据流输入和输出Kafka的框架.Confluent平台附带了几个内置connector,可以使用这些connector进行关系数据库或HDFS等常用系统到 ...

  10. manjaro20配置matebook fn驱动

    安装fn驱动 https://github.com/aymanbagabas/Huawei-WMI Latest release中下载并安装 matebook-applet_2.4.8_amd64.d ...