hdu 2018多校8
A.Character Encoding 简单计数
m个非负数和等于k的方案数为$\binom{m+k-1}{k}$, 但题目还要求每个数小于n, 容斥一下即可
即$ans = \sum\limits_{0\le i \le m}(-1)^i\binom{m}{i}\binom{m+k-1-ni}{k}$
B.Pizza Hub 计算几何
贪心可以知道最优情况三角形一定有一个顶点与矩形顶点重合, 暴力枚举判断一下即可
C. 不会
D.Parentheses Matrix 贪心
假设行列都为偶数, 因为奇数很容易特判. 再假设n>m, 我们假设初状态是每行全匹配, 再逐步调整到最优.
首先注意到第一列和最后一列显然不能动, 再考虑中间列的情况, 这里可以分两种情况讨论:
1, 保证每行都匹配
这样的话显然中间列匹配的上界为n+m/2-1, 手画一下很容易达到这个上界.
2, 不保证行匹配
这样的话, 手画一下可以发现, 通过破坏第一行和最后一行可以使得列全部匹配, 达到上界n+m-4.
最后取两种情况最大值即可.
但这题交了以后竟然WA了, 找了份题解拍了下所有小于200的n和m, 没发现是哪出锅了....
E. Magic Square 纯签到题
F. 不会
G.Make ZYB Happy 后缀自动机 (以后有时间补吧)
H. Taotao Picks Apples 讨论一下再二分
I.Pop the Balloons 状压
挺好的一个状压题, 三进制压一下, 第i位的0表示无气球, 1表示该位有气球, 2表示该位扎过一个气球
然后dp一次求出每种状态的方案数, 最后再统计答案即可.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#define pb push_back
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll; const int N = 531450;
int n, m, k, t;
char a[22][22], b[22][22];
int g[N][22];
int fac[22], base[3][22];
ll dp[22][N], ans[22];
vector<int> f[22]; void work() {
scanf("%d%d%d", &n, &m, &k);
REP(i,1,n) scanf("%s", a[i]+1);
if (n<m) {
swap(n,m);
REP(i,1,n) REP(j,1,m) b[i][j]=a[j][i];
REP(i,1,n) REP(j,1,m) a[i][j]=b[i][j];
}
int mx = base[1][m]-1;
REP(i,1,n) f[i].clear();
REP(i,0,n) REP(j,0,mx) dp[i][j]=0;
REP(i,1,k) ans[i]=0;
REP(i,1,n) REP(j,1,m) if (a[i][j]=='Q') f[i].pb(j-1);
dp[0][0] = 1;
REP(i,1,n) REP(s,0,mx) if (dp[i-1][s]) {
int ss = s;
for (int j:f[i]) if (g[s][j]<2) {
dp[i][s-base[g[s][j]][j]+base[2][j]]+=dp[i-1][s];
if (!g[s][j]) ss += base[1][j];
}
dp[i][ss] += dp[i-1][s];
}
REP(s,0,mx) if (dp[n][s]) {
int f = 1, cnt = 0;
REP(j,0,m-1) {
if (g[s][j]==1) {f=0;break;}
if (g[s][j]==2) ++cnt;
}
if (f) ans[cnt] += dp[n][s];
}
ll mod = 1e12;
REP(i,1,k) {
__int128 t = (__int128)ans[i]*fac[i];
if (t>mod) printf("%lld%012lld\n",(ll)(t/mod),(ll)(t%mod));
else printf("%lld\n", (ll)t);
}
} int main() {
fac[0]=base[1][0]=1,base[2][0]=2;
REP(i,1,12) fac[i]=fac[i-1]*i;
REP(i,1,12) base[1][i]=base[1][i-1]*3;
REP(i,1,12) base[2][i]=base[2][i-1]*3;
REP(i,0,N-1) {
int t = i;
REP(j,0,12) g[i][j]=t%3, t/=3;
}
scanf("%d", &t);
REP(i,1,t) work();
}
hdu 2018多校8的更多相关文章
- HDU 2018 DP
A - 母牛的故事 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- Time Zone 【模拟时区转换】(HDU暑假2018多校第一场)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6308 Time Zone Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 6312 - Game - [博弈][杭电2018多校赛2]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312 Problem Description Alice and Bob are playing a ...
- HDU 6318 - Swaps and Inversions - [离散化+树状数组求逆序数][杭电2018多校赛2]
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=6318 Problem Description Long long ago, there was an ...
- 2018多校第十场 HDU 6430 (线段树合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6430 题意:一棵树上每个节点权值为v[i],每个节点的heard值是:以它为LCA的两个节点的GCD的 ...
- 2018多校第九场1004(HDU 6415) DP
本以为是个找规律的题一直没找出来... 题目:给你一个n*m的矩阵和1-n*m个数,问有多少种情况满足纳什均衡的点只有一个.纳什均衡点是指这个元素在所在行和所在列都是最大的. 思路:吉老师直播的思路: ...
- HDU 6397(2018多校第8场1001) Character Encoding 容斥
听了杜教的直播后知道了怎么做,有两种方法,一种构造函数(现在太菜了,听不懂,以后再补),一种容斥原理. 知识补充1:若x1,x2,.....xn均大于等于0,则x1+x2+...+xn=k的方案数是C ...
- HDU 6395(2018多校第7场1010)Sequence
不久前做过POJ3070,所以知道这题要用矩阵快速幂优化,但是这个题的递推公式中有一项⌊p/n⌋,场上就不会了... 下来才知道要用分块矩阵快速幂,因为⌊p/n⌋最多有2√p块,可以对每一块使用快速幂 ...
- HDU 6396(2018多校第七场1011) Swordsman
场上场下各种TLE到怀疑人生...经过大佬指点之后才知道要用fread才能过,一般的快读不行... 题意:一个剑客打小怪兽,有n头小怪兽,剑客和小怪兽有m个属性.只有剑客的m个属性都大于等于某个小怪兽 ...
随机推荐
- linux常用命令:chmod 命令
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...
- 使用 jQuery 进行前端验证
前段验证脚本的教程,其基础为jQuery的插件validate. 一.可以验证哪些信息 要求输入不能为空 要求输入格式必须为电子邮箱 要求输入格式必须为URL 要求输入格式必须为日期 要求输入格 ...
- Linux笔记 #07# 搭建机器学习环境
环境: Debian 8.8 64位, 同样适用 win10 基本步骤: 安装 Python 安装必要的库 测试 一.安装 Python 延续之前的 搭建 Python 环境 选取折中版本 Pytho ...
- Js中String转int
Js中String转int 方案一代码: Number(str) 方案二代码: //parseInt 方法都有两个参数, 第一个参数就是要转换的对象, 第二个参数是进制基数, 可以是 2, 8, 10 ...
- noip 2014 提高组 Day 2
1.无线网络发射器选址 这道题数据范围很小,就直接暴力枚举就好了.为了提高速度,就从每个有公共场所的点枚举周围在(x,y)放无线网路发射器可以增加的公共场所数量,加到一个数组里.所有公共场所都处理完了 ...
- POJ 1740 A New Stone Game(博弈)题解
题意:有n个石子堆,每一个都可以轮流做如下操作:选一个石堆,移除至少1个石子,然后可以把这堆石子随便拿几次,随便放到任意的其他石子数不为0的石子堆,也可以不拿.不能操作败. 思路:我们先来证明,如果某 ...
- BZOJ5168: [HAOI2014]贴海报 线段树
Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙.张贴规则如下 ...
- 51nod 1463 找朋友(线段树+离线处理)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1463 题意: 思路: 好题! 先对所有查询进行离线处理,按照右区间排序, ...
- MVC ---- T4模板的小练习
1.先建立两个模板文件 :Manger.ttinclude.DBHelper.ttinclude Manger.ttinclude <#@ assembly name="System. ...
- UOJ【UR #12】实验室外的攻防战
题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...