正题

题目链接:https://www.luogu.com.cn/problem/P7736


题目大意

有\(k\)层的图,第\(i\)层有\(n_i\)个点,每层的点从上到下排列,层从左到右排列。再给出连接相邻层的一些有向边(从\(i\)层连向\(i+1\)层)。

对于\(n_1\)层每个点作为起点同时出发走到不同的\(n_k\)层的点的所有路径方案中,交点数量为偶数的减去为奇数的方案有多少个。

\(1\leq k\leq 100,2\leq n_1\leq 100,n_1=n_k,n_1\leq n_i\leq 2\times n_1,1\leq T\leq 5\)


解题思路

分析一下,若第\(1\)层起点\(1,2\)分别对应终点\(1,2\),记\(f_{i,1/2}\)表示\(1/2\)在第\(i\)层的位置。中间某个位置他们路径有了交点,那么一定满足他们存在一层使得\(f_{i,1}>f_{i,2}\)但是因为\(f_{1,1}<f_{1,2}\)且\(f_{n,1}<f_{n,2}\)也就是说明前后都各有一个交点。

拓展一下也就是说中间的路径走法不影响交点的奇偶性,只有起点和终点会影响奇偶性。再进一步说,路径交点的奇偶性就是起点对应终点的排列\(p_i\)的逆序对数量的奇偶性。

设排列\(p\)表示起点\(i\)会走到终点\(p_i\),\(\sigma(p)\)表示排列\(p\)的逆序对数量,\(w(p)\)表示排列\(p\)的路径方案

那么答案就是

\[\sum (-1)^{\sigma(p)}w(p)
\]

发现和\(LGV\)引理的式子一模一样,直接上就好了

时间复杂度\(O(T(k^2n+n^3))\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<vector>
#define ll long long
using namespace std;
const ll N=210,P=998244353;
ll T,k,n[N],m[N],f[N][N],a[N][N];
vector<int> G[N][N];
ll read(){
ll x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
ll det(ll n){
ll ans=1,f=1;
for(ll i=1;i<=n;i++){
for(ll j=i;j<=n;j++)
if(a[j][i]){
if(j!=i)swap(a[j],a[i]),f=!f;
break;
}
ll inv=power(a[i][i],P-2);ans=ans*a[i][i]%P;
for(ll j=i;j<=n;j++)a[i][j]=a[i][j]*inv%P;
for(ll j=i+1;j<=n;j++){
ll rate=P-a[j][i];
for(ll k=i;k<=n;k++)
(a[j][k]+=rate*a[i][k]%P)%=P;
}
}
return f?ans:((P-ans)%P);
}
signed main()
{
T=read();
while(T--){
k=read();
for(ll i=1;i<=k;i++)n[i]=read();
for(ll i=1;i<k;i++)m[i]=read();
for(ll i=1;i<k;i++){
for(ll j=1;j<=m[i];j++){
ll x=read(),y=read();
G[i][x].push_back(y);
}
}
for(ll i=1;i<=n[k];i++){
f[k][i]=1;f[k][i-1]=0;
for(ll j=k-1;j>=1;j--)
for(ll x=1;x<=n[j];x++){
f[j][x]=0;
for(ll p=0;p<G[j][x].size();p++)
(f[j][x]+=f[j+1][G[j][x][p]])%=P;
}
for(ll j=1;j<=n[1];j++)
a[j][i]=f[1][j];
}
f[k][n[k]]=0;
printf("%lld\n",det(n[1]));
for(ll i=1;i<=k;i++)
for(ll j=1;j<=n[i];j++)
G[i][j].clear();
}
return 0;
}

P7736-[NOI2021]路径交点【LGV引理】的更多相关文章

  1. LGV 引理小记

    讲个笑话,NOI 之前某场模拟赛让我知道了这个神奇的科技,于是准备 NOI 之前学完,结果鸽着鸽着就鸽掉了,考 day1 之前一天本来准备花一天时间学的,然后我就开玩笑般地跟自己说,这么 trivia ...

  2. LGV 引理

    (其实是贺的:https://www.luogu.com.cn/paste/whl2joo4) 目录 LGV 引理 不相交路径计数 例题 Luogu6657. [模板]LGV 引理 CF348D Tu ...

  3. LGV 引理——二维DAG上 n 点对不相交路径方案数

    文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...

  4. 2021牛客暑期多校训练营9C-Cells【LGV引理,范德蒙德行列式】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11260/C 题目大意 一个平面上,\(n\)个起点\((0,a_i)\)分别对应终点\((i,0)\),每次 ...

  5. P6657-[模板]LGV 引理

    正题 题目链接:https://www.luogu.com.cn/problem/P6657 题目大意 给出$n\times n$的棋盘,$m$个起点第$i$个为$(1,a_i)$,对应$m$个终点第 ...

  6. [luogu7736]路径交点

    对于两条路径,注意到每一个交点都会改变两者的上下关系,因此两条路径交点的奇偶性,仅取决于两者的起点和终点是否改变了上下关系(改变即为奇数) 类似地,对于整个路径方案,令$p_{i}$为以第一层的$i$ ...

  7. NOI2021游记

    NOI2021游记 前言 写于 2021.7.28,成绩榜刚出后几个小时.总分 345 拿到银牌 183 名. 我的高中 OI 生活在这里画上句号.结局对我而言虽然不够完美,但是无论怎样都是我人生道路 ...

  8. NOI2021 去不了记

    没错,由于某些 zszz 的原因,我是真的去不了了(指去不了 ZJ) Day -11 ~ -7 - 2021.7.12 - 2021.7.16 令人自闭的 ISIJ 终于结束了----From ycx ...

  9. NOI2021 同步赛游记

    写在前面的话 为什么叫游记呢?因为我第一天是在划水中度过的,错过了对原题的发现. O n e I n D a r k \tt OneInDark OneInDark 无比风光地去了浙江,却倒霉地遇上了 ...

随机推荐

  1. flutter实现文字超出最大宽度显示省略号

    Container( width: 60, child: Text( '...', maxLines: 1, overflow: TextOverflow.ellipsis, ), ) 给Text外层 ...

  2. flutter中修改键盘状态

    当用户进行表格输入时,为更方便的方便用户操作,我们需要设置键盘状态方便用户点击,如当表格填写完成时,用户可以直接点击键盘下面的"完成"状态完成提交. 实现如下: TextFormF ...

  3. 基于WindowsService的WebSocket编程Demo

    一.什么是WebSocket WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端.说了半天也就是说有了它 ...

  4. 解析一个body片断

    问题 假如你有一个HTML片断 (比如. 一个 div 包含一对 p 标签; 一个不完整的HTML文档) 想对它进行解析.这个HTML片断可以是用户提交的一条评论或在一个CMS页面中编辑body部分. ...

  5. 【转】新说Mysql事务隔离级别

    作者:孤独烟 转自:https://www.cnblogs.com/rjzheng/p/9955395.html 引言 大家在面试中一定碰到过 说说事务的隔离级别吧? 老实说,事务隔离级别这个问题,无 ...

  6. 关于Ubuntu18.04 linux系统使用搜狗输入法 出现乱码

    解决: 执行下面的命令即可!无需重启系统 killall fcitx

  7. mzy git学习,撤销修改(二)

    git checkout – file: 撤销我们对工作区的修改(没有提交到暂存区) 当我们在工作区修改了之后,并没有提交到暂存区,如果要撤销对 某个文件的修改的话,就使用 git checkout ...

  8. Dijkstra链路状态选路算法

  9. MySQL5.7.24 安装

    官网地址 https://dev.mysql.com/downloads/mysql/ 1. 安装依赖 yum install -y cmake make gcc gcc-c++ libaio ncu ...

  10. plsql中数据生成工具data generator的使用

    使用数据库时,有时需要使用大量的数据,可以用PLSQL Developer提供的Data Generator工具, 这里记录一下工具的介绍及几个使用注意事项 1.工具介绍 功能入口位于 工具 菜单下, ...