2024ICPC网络赛第一场C. Permutation Counting 4(线性代数)

题目链接

题目大意:给你n个范围 l i , r i l_i,r_i li,ri,每个位置可以在这个范围中选择一个数,然后形成排列1到n的排列p。问p的所有情况的个数的奇偶性。

一个很妙的行列式转化,纯纯的线性代数。

首先,我们把p的总数表示出来。设矩阵 a i , j a_{i,j} ai,j,表示的是第 i 个 i个 i个位置的是否可以表示 j j j。则p的所有可能为 ∑ p Π i = 1 n a i , P i \sum\limits_{p}\mathop{\Pi}\limits_{i=1}^{n}a_{i,Pi} p∑i=1Πnai,Pi

其中p表示所有排列方式的总和。发现这是近似于矩阵a的行列式的值,不过去掉了其正负号。(在取模2的影响下,综合的加减没有影响)也就是说,只要我们求矩阵 a a a的行列式的值 m o d 2 mod\ 2 mod 2,就可以解出最终解。

根据矩阵的性质,矩阵的行列式 m o d 2 mod\ 2 mod 2为 0 0 0,等价于该矩阵 m o d 2 mod\ 2 mod 2下不可逆,也等价于该矩阵 m o d 2 mod\ 2 mod 2下的每一行的向量存在线性相关,也就是存在其中一个向量可以被其它向量表示。

至此,我们终于该题从看不懂的样子转化成了看起来像人话的子问题了。让我们解决这个子问题。每一个位置的向量 l i , r i l_i,r_i li,ri我们可以通过 r i − ( l i − 1 ) r_i-(l_{i}-1) ri−(li−1)表示,然后通过并查集判断出该向量能否通过其它向量表示。

cpp 复制代码
int n,m;

int pre[1000005];

int find (int x){
    if(pre[x]==x)return x;
    else return pre[x]=find(pre[x]);
}

void icealsoheat(){
    
    cin>>n;

    for(int i=0;i<=n;i++)pre[i]=i;

    int ans=1;

    for(int i=1;i<=n;i++){
        int l,r;
        cin>>l>>r;
        l=find(l-1);
        r=find(r);

        if(l==r){
            ans=0;
            // break;
        }
        else{
            pre[l]=r;
        }
    }

    cout<<ans<<"\n";

}
相关推荐
Geek-Chow11 分钟前
Mobile App Certificate Pinning: Underlying Principle and a Swift Example
开发语言·ios·swift·安全架构
码云骑士15 分钟前
61-LangChain-vs-LlamaIndex-选型对比-功能矩阵-混用实践
python·线性代数·矩阵·langchain
王老师青少年编程15 分钟前
2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月11日试卷一)【文末附答案和解析】
c++·真题·答案·复赛·2026年·青少年信息素养大赛·算法应用主题赛
阿豪只会阿巴20 分钟前
两小时快速入门 FastAPI--第一回
开发语言·python·fastapi
你怎么知道我是队长35 分钟前
JavaScript 事件介绍
开发语言·前端·javascript
CodeStats41 分钟前
【Linux IO】从文件描述符到硬件中断:Linux IO 系统底层完全拆解
java·linux·开发语言·io·socket
大阿明1 小时前
C++智能指针与RAII机制精讲:彻底根治内存泄漏与野指针
java·jvm·c++
一生了无挂1 小时前
C++面向对象核心精讲:类、对象、封装、权限与生命周期全解析
java·jvm·c++
aaPIXa6221 小时前
C++ 用 Claude Code 的 defending-code-reference-harness:C/C++ 内存漏洞自动发现与修复 Pipeline
java·c语言·c++
着迷不白1 小时前
Linux系统故障修复、日志管理与安全加固实战指南
开发语言·php