【CF736D】Permutations 线性代数+高斯消元
【CF736D】Permutations
题意:有一个未知长度为n的排列和m个条件,第i个条件$(a_i,b_i)$表示第$a_i$个位置上的数可以为$b_i$。保证最终合法的排列的个数是奇数。现在有m个询问,第i个询问是问你在去掉第i个条件后,最终合法的排列数是奇数还是偶数。
$n\le 2000,m\le min(C_n^2,500000)$
题解:神题,滚去学线代了。
因为在$\mod 2$意义下,-1和1相等,所以方案数是什么?如果把所给条件看成一个01矩阵的话,则答案就是这个矩阵对应的行列式的值!而去掉一个条件(a,b)后的答案是什么?1xor行列式的代数余子式$M_{ab}$的值!而题目保证所给矩阵是可逆的,所以我们可以应用性质:
$A^{*}=|A|A^{-1}$(其中$A^{*}$表示伴随矩阵,$A_{ij}=M_{ji}$)
所以只需要求出原矩阵的逆即可,可以采用高斯消元。因为是$\mod 2$意义下的,所以可以采用bitset优化,时间复杂度$O({n^3\over 32})$。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
int pa[500010],pb[500010];
bitset<4001> v[2005];
int n,m;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
} int main()
{
n=rd(),m=rd();
int i,j;
for(i=1;i<=m;i++) pa[i]=rd()-1,pb[i]=rd()-1,v[pa[i]][pb[i]]=1;
for(i=0;i<n;i++) v[i][i+n]=1;
for(i=0;i<n;i++)
{
if(!v[i][i])
{
for(j=i+1;j<n;j++) if(v[j][i]) break;
swap(v[j],v[i]);
}
for(j=0;j<n;j++) if(j!=i&&v[j][i]) v[j]^=v[i];
}
for(i=1;i<=m;i++)
{
if(v[pb[i]][pa[i]+n]) puts("NO");
else puts("YES");
}
return 0;
}
【CF736D】Permutations 线性代数+高斯消元的更多相关文章
- P3265 [JLOI2015]装备购买(高斯消元+贪心,线性代数)
题意; 有n个装备,每个装备有m个属性,每件装备的价值为cost. 小哥,为了省钱,如果第j个装备的属性可以由其他准备组合而来.比如 每个装备属性表示为, b1, b2.......bm . 它可以由 ...
- 【高斯消元】CDOJ1785 曜酱的线性代数课堂(三)
高斯消元求行列式板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...
- 【高斯消元】CDOJ1784 曜酱的线性代数课堂(二)
高斯消元求矩阵秩板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...
- 【高斯消元】CDOJ1783 曜酱的线性代数课堂(一)
高斯消元求逆矩阵板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...
- [高斯消元] POJ 2345 Central heating
Central heating Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 614 Accepted: 286 Des ...
- 高斯消元 分析 && 模板 (转载)
转载自:http://hi.baidu.com/czyuan_acm/item/dce4e6f8a8c45f13d7ff8cda czyuan 先上模板: /* 用于求整数解得方程组. */ #inc ...
- POJ 1830 开关问题(高斯消元)题解
思路:乍一看好像和线性代数没什么关系.我们用一个数组B表示第i个位置的灯变了没有,然后假设我用u[i] = 1表示动开关i,mp[i][j] = 1表示动了i之后j也会跟着动,那么第i个开关的最终状态 ...
- poj1222(枚举or高斯消元解mod2方程组)
题目链接: http://poj.org/problem?id=1222 题意: 有一个 5 * 6 的初始矩阵, 1 表示一个亮灯泡, 0 表示一个不亮的灯泡. 对 (i, j) 位置进行一次操作则 ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
随机推荐
- asp.net mvc maproute定义可变数量的自定义片断变量
有时候我们定义了如{controller}/{action}/{id}之类的路由规则,但是后面还可能跟上一堆可能会有可能不会有,但是路由规则是一样的,如{controller}/{action}/{i ...
- datatable编辑一行数据的方法
let d =t.row($(e).parents("tr")).data(); 上面的是获取一行数据的方法,如果是更改一行数据,则传入根之前数据结构相同的对象或者数组即可: t. ...
- php命令
今天因为psi无法在5.3版本上运行,正好看了下这些php版本的特性. 无意中,5.4版本 Buid-in web server内置了一个简单的Web服务器 $ php -S localhost: 于 ...
- Python多线程运行带多个参数的函数
在python中经常会到用多线程处理某个函数来缩短运行时间. from multiprocessing import Pool def work(x): return x+1 pool = Pool( ...
- Oracle创建directory
Oracle创建directory 一般创建directory都是为了用数据泵导入/导出数据用,其实directory还有很多别的用处,本文不做阐述 1.新建directory的语法 CREA ...
- convertView&setTag方法的一点理解
前言 首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essent ...
- JointJS绘制流程图
摘要: JointJS是一个javascript图表库.你可以使用它制作静态或者动态的图表.关系表.流程图. 效果图:
- C# IsBackground作用
https://blog.csdn.net/snakorse/article/details/43888847 要点: 1.当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为 ...
- 定时器Enable Disable控制
问题:定时器如何控制它一会可用一会不可用,根据某个业务需求,比如:一个控制台程序扫描表中某个条件的数据,处理数据,控制台分布式部署,当主机宕机后,从机扫描定时器需要可用,当主机复活后,从机的扫描定时器 ...
- java TreeNode接口
今天写安卓程序见到一个方法getChildAt();不懂其用边去百度搜索了一下,看到了它的api,细致看看原来是在接口里面如今我把这个api贴给大家共享假设是操作xml我认为用这个非常方便 javax ...