CF468E Permanent 题解
考虑暴力状压 DP。
按行 DP,记录列哪些被选过,可以做到 \(O(2^kk^2)\)。
注意到某一列扫完了之后这一列选没选过不重要,可以减少这里的状态。
简单优化一下,每次选择最少的一列,使这一列一定被减少一。
然后就可以过了,卡不满。
Code
const int N=1e5+5,mod=1e9+7;
int x[60],y[60],a[60],b[60],v[60],val[60][60],fac[N];
int ca[60],cb[60];
unordered_map<ll,int> f[60],g[60];
int main() {
int n=read(),k=read();
FOR(i,1,k) a[i]=x[i]=read(),b[i]=y[i]=read(),v[i]=(0ll+mod+read()-1)%mod;
fac[0]=1;
FOR(i,1,n) fac[i]=1ll*fac[i-1]*i%mod;
sort(a+1,a+k+1),sort(b+1,b+k+1);
int al=unique(a+1,a+k+1)-a-1,bl=unique(b+1,b+k+1)-b-1;
FOR(i,1,al) FOR(j,1,bl) val[i][j]=-1;
FOR(i,1,k) {
x[i]=lower_bound(a+1,a+al+1,x[i])-a;
y[i]=lower_bound(b+1,b+bl+1,y[i])-b;
val[x[i]][y[i]]=v[i],ca[x[i]]++,cb[y[i]]++;
}
f[0][0]=1;
while(1) {
int id=0;
FOR(i,1,bl) if(cb[i]&&(id==0||cb[i]<cb[id])) id=i;
if(id==0) break;
FOR(i,1,al) if(val[i][id]!=-1&&ca[i]) {
ca[i]=0;
vi S;
ll all=((1ll<<k)-1)<<1;
FOR(j,1,bl) if(val[i][j]!=-1) {
S.pb(j),cb[j]--;
if(cb[j]==0) all^=(1ll<<j);
}
FOR(j,0,k) for(auto u:f[j]) {
g[j][u.fi&all]=(g[j][u.fi&all]+u.se)%mod;
for(int l:S) if(!(u.fi&(1ll<<l)))
g[j+1][(u.fi|(1ll<<l))&all]=(g[j+1][(u.fi|(1ll<<l))&all]+
1ll*u.se*val[i][l]%mod)%mod;
}
FOR(j,0,k) swap(f[j],g[j]),g[j].clear();
}
}
int ans=0;
FOR(i,0,k) for(auto u:f[i]) ans=(ans+1ll*fac[n-i]*u.se%mod)%mod;
printf("%d\n",ans);
}
CF468E Permanent 题解的更多相关文章
- [题解] Codeforces 468 E Permanent 折半,DP,图论
题目 建立一个二分图,左右各n个点,在左边的第x个点和右边的第y个点之间连一条权值为\(a_{x,y}\)的边.根据"积和式"的定义,我们是要在矩阵中选择n个位置,满足任意两个位置 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- JavaScript:七大基础数据类型:数值number及其表示范围
数值number类型,用来表示任何类型的数字:整数或者浮点数都可以: 实际上,JS中的数值,是一个64位的浮点数,这与Java中的double类型的浮点数是一致的: 但是它有表示的范围,在范围内,JS ...
- APICloud 入门教程窗口篇
什么是窗口,窗口可以理解为一屏幕内容的一个基本载体,里面可以放导航,图片,视频,文字等组成一屏幕内容. 不同的窗口组成一个APP, 例如购物APP有[首页],[购物车],[我的]等不同的窗口.不同的窗 ...
- 分享一般.net core的web项目发布到服务器环境的处理步骤(来自本人实践笔记)
<步骤1:发布> <步骤2:确保已打开iis web相关功能> [注]如果未打开在按如下操作. Win7/win10通过打开或关闭windows功能. Windows2012等 ...
- Kubernetes 部署 - DevOps CI/CD详细指南
什么是Kubernetes部署? 在此文章中,我们将探索Kubernetes(K8s),结合DigitalOcean Kubernetes集群与Buddy自动化运维系统部署以达到以下列出的目标: 使 ...
- MySQL 更新数据 不同条件(批量)更新不同值
一般在更新时会遇到以下场景:1.全部更新:2.根据条件更新字段中的某部分内容:3.根据不同的条件更新不同的值,以下是几种场景中常用的update方法. 一.方法分类 二.具体用法 (1)根据条件更新值 ...
- js获取时间最详细~~~~
最详细 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 解决Java.awt设计GUI程序时Label标签中文乱码解决(idea)
未修改时对话框里边无法显示Label的文本内容,显示的都是方框!网上都是Run--Edit Configurations--VM options:填入-Dfile.encoding=gbk 但是我实际 ...
- 0基础搭建基于OpenAI的ChatGPT钉钉聊天机器人
前言:以下文章来源于我去年写的个人公众号.最近chatgpt又开始流行,顺便把原文内容发到博客园上遛一遛. 注意事项和指引: 注册openai账号,需要有梯子进行访问,最好是欧美国家的IP,亚洲国家容 ...
- Selenium Webdriver驱动自管理
Webdriver驱动自管理 背景 在selenium自动化中,驱动和浏览器有一定的对应关系,以最常见的chrome和firefox为例. chrome 要求比较严格. 比如在地址栏输入chrome: ...
- redis实现分布式锁(包含代码以及分析利弊)
redis实现分布式锁(基础版) 使用redis实现分布式锁的方法有多种,基础版本是基于setnx命令,即如果不存在则设置.这个命令可以保证只有一个客户端能够成功设置一个key,从而获得锁.设置key ...