放棋子(chess.pas/c/cpp)
题目大意
现在有一个 n*m 的棋盘,现在你需要在棋盘上摆放 2n 个棋子,要求满足如下条件:
1、 每一列只能有一个棋子;
2、 每一行的前 xi 个格子有一个棋子,而且最多有一个棋子;
3、 每一行的后 yi 个格子有一个棋子,而且最多有一个棋子;
求一共有多少种不同的放置方案,答案对于 1000000007 取模
输入文件
输入文件为 chess.in。
输入共有 n+1 行。第一行有两个整数 n,m,表示该棋盘的行数与列数。
接下来的 n 行,每行两个整数 xi 和 yi,表示每一行的前 xi 个格子需要有一个棋子,每
一行的后 yi 个格子需要有一个棋子。
输出文件
输出文件为 chess.out。
输出一个整数表示共有多少种不同的方案,答案对于 1000000007 取模。
样例输入
3 6
1 2
3 3
3 2
样例输出
4
数据规模与约定
n<=50 m<=200
对于所有的 i,有 xi+yi≤m。

——————————————————————————题解

首先60分我们只需要拿乘法原理算算算就可以了(把x,y排列顺序不影响结果,那就变成排列后左边对于第一行有x1中方法,第二行有x2-1种,第n行有xn-n+1种,乘法原理乘起来就好了,右边同理,然后左右方案数相乘)因为最大的xi和最大的yi不会重合,但是如果他们最大重合了就要换一个做法

首先我们左边从小到大,右边从大到小这么想,因为xi+yi≤m,所以方块排序后不会重叠,只是一列可能有两种颜色

然后从左往右扫

然后我们对右边来说事,也是从左往右扫,才能把两者结合在一起

然后我们发现这只与i(扫到第几行),k(选了几个数),j(右边可以放几个)有关,然后我们把两边结合到一起

得到:

不在右边放f[i+1][j+p][k+z]+=f[i][j][k]*A(i-k,z)

在右边放f[i+1][j-1+p][k+z+1]+=f[i][j][k]*j

最后的答案是f[m+1][0][2*n],因为到了m列的时候右边还是可以放的

啊累死我了……本题结束了……下面是代码……

 #include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#define mo 1000000007
#define siji(i,x,y) for(int i=(x);i<=(y);i++)
#define gongzi(j,x,y) for(int j=(x);j>=(y);j--)
#define xiaosiji(i,x,y) for(int i=(x);i<(y);i++)
#define sigongzi(j,x,y) for(int j=(x);j>(y);j--)
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int n,m,x[],y[],z[],p[],b[],c[];
int a[][];
void anm() {
siji(i,,) a[i][]=;
siji(i,,) {
siji(j,,) {
a[i][j]=1LL*i*a[i-][j-]%mo;
}
}
}
void init() {
scanf("%d%d",&n,&m);
if(m<*n) {puts("");exit();}
siji(i,,n) {
scanf("%d%d",&x[i],&y[i]);
z[x[i]]++;
p[m-y[i]]++;//这是下一列要有的右端开头
}
siji(i,,m) b[i]=b[i-]+p[i-];//这是个常数优化,加上后快到飞起
siji(i,,m) c[i]=c[i-]+z[i];//同上
anm();//组合数预处理
}
int f[][][];//f(i,j,k)
void solve() {
f[][][]=;//初始化
siji(i,,m) {
siji(j,,b[i]) {//可以改成0-n
siji(k,c[i-],i) {//可以改成0-m
f[i+][j+p[i]][k+z[i]]=(f[i+][j+p[i]][k+z[i]]+1LL*f[i][j][k]*a[i-k][z[i]])%mo;
if(j-+p[i]>=)
f[i+][j-+p[i]][k+z[i]+]=(f[i+][j-+p[i]][k+z[i]+]+1LL*j*f[i][j][k]*a[i-k-][z[i]])%mo; }
}
}
printf("%d\n",f[m+][][*n]);
}
int main()
{
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
init();
solve();
}

辽宁OI2016夏令营模拟T3-chess的更多相关文章

  1. 辽宁OI2016夏令营模拟T2-road

    最短路(road.pas/c/cpp)题目大意有一个点数为 n,边数为 m 的无向图,点的编号为 1 到 n.边的权值均为非负数.现在请你求出从点 1 到点 n 的最短路径条数,若有无限条则输出-1, ...

  2. 辽宁OI2016夏令营模拟T1-dis

    数值距离(dis.pas/c/cpp)题目大意我们可以对一个数 x 进行两种操作:1. 选择一个质数 y,将 x 变为 x*y2. 选择一个 x 的质因数 y,将 x 变为 x/y定义两个数 a,b ...

  3. 20180520模拟赛T3——chess

    [问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...

  4. Noip2017 普及 T3 Chess

    神奇的场上原码 #include<iostream> #include<cstdio> #include<cstring> #include<queue> ...

  5. 洛谷金秋夏令营模拟赛 第2场 T11737 时之终末

    这道题就是道状压dp...比赛的时候太贪心 然后状压又不好 所以T2 T3一起挂了QAQ 吸取教训QAQ f[i][j][k]表示前i个数选了j个 最后a个的状态为k的答案 #include<c ...

  6. 洛谷金秋夏令营模拟赛 第2场 T11738 伪神

    调了一个下午只有八十分QAQ md弃了不管了 对拍也没拍出来 鬼知道是什么数据把我卡了QAQ 没事我只是个SB而已 这题其实还是蛮正常的 做法其实很简单 根据链剖的构造方法 你每次修改都是一段又一段的 ...

  7. [CSP-S模拟测试]:chess(数学)

    题目描述 $dirty$在一个棋盘上放起了棋子. 棋盘规格为$n\times m$,他希望任意一个$n\times n$的区域内都有$C$个棋子.$dirty$很快就放置好了一个满足条件的棋盘方案,但 ...

  8. [CSP-S模拟测试]:chess(搜索+最短路)

    题目描述 $pig$在下象棋的时候特别喜欢用马,他总是计算着自己的马还需要几步才能吃掉对方的帅,以及方案数的个数,当然$pig$很笨,所以他只能求助于你.我们假设在$n\times m$的棋盘上,$p ...

  9. 2019.03.27【GDOI2019】模拟 T3

    题目大意 给出$n$, $p$, 求有多少长度为$n$的排列可以被分成三个上升子序列, 数量对$p$取模, 数据范围 $3 \leq n \leq 500$. 思路 首先让我们考虑如果有一个排列,如何 ...

随机推荐

  1. 【Java每日一题】20170111

    20170110问题解析请点击今日问题下方的"[Java每日一题]20170111"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  2. [UI] APP界面设计流程

    此教程从交互开始进行APP界面设计,主要是一个流程,还是值得童鞋们学习一下的.包括:1.交互流程设计:2.风格定位:3.功能icon设计:4.界面视效整体优化:5.应用icon设计.

  3. 用linux 命令 执行ci框架的方法

    最近要跑一个数据量比较大的脚本,刚开始在浏览器页面访问发行nginx 5.4 超时, 又不想去修改nginx的连接时间,只能在服务器执行了, 执行方法:进入到ci 的根目录:#php index.ph ...

  4. Date类型常用概念及方法总结(1)

      Date类型使用UTC(国际协调时间)1970年1月1日零时开始经过的毫秒数来保存时间. (1)创建当前日期           调用Date不传递参数的情况下,创建的新对象自动获得当前日期和时间 ...

  5. 向python3进发

    在Python2.x中,交互输入有input和raw_input两种方法 input-----------tmd是个坑,就别用 raw_input------把输入无论是Int或str都当做是str处 ...

  6. java-并发解决方案

    并发产生数据不一致的原因:1.程序共享对象:2.多线程.3.基于1和2,取出来的数据可能不是最新的. 解决方案:只要是原子性操作,就不会出现问题.原子性操作,代表cpu会一直执行这个操作,知道结束. ...

  7. 一步步优化JVM五:优化延迟或者响应时间

    本节的目标是做一些优化以满足对应用对延迟的需求.这次需要几个步骤,包括完善Java堆大小的配置,评估垃圾回收占用的时间和频率,也许还要尝试切换到不同的垃圾回收器,以及由于使用了不同的垃圾回收器,需要重 ...

  8. android .9图片制作与注意

    首先找到你的开发软件所依赖的SDK,在电脑中找到这个SDK的安装路径,如果有太多SDK分不清楚,Window→Android SDK Manager 点开可以看到你的依赖SDK路径,多余的不说直接发个 ...

  9. php 常量定义

    php常量定义及取值  常量在定义时赋值:  不能变 :不能销毁: 具有超全局作用于:常量只能储存标量数据(字符 整型 浮点 ): <?php define("hello", ...

  10. HDU 5873 Football Games

    随便判了几个条件就过了,也不知道对不对的. 正解应该是: $[1].$${s_1} + {s_2} + {s_3} + ...... + {s_n} = n(n - 1)$ $[2].$${s_1} ...