3139:[HNOI2013]比赛 - BZOJ
题目描述 Description
沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛。此次联赛共N只队伍参加,比赛规则如下:
(1) 每两支球队之间踢一场比赛。
(2) 若平局,两支球队各得1分。
(3) 否则胜利的球队得3分,败者不得分。
尽管非常遗憾没有观赏到精彩的比赛,但沫沫通过新闻知道了每支球队的最后总得分,然后聪明的她想计算出中多少种可能的比赛情况。
但沫沫发现当球队较多时,计算工作量将非常大,所以这个任务就交给你了。请你计算出可能的比赛过程的数目,由于答案可能很大,你只需要输出答案对109+7取模的结果。
输入描述 Input Description
第一行是一个正整数N。
接下来一行N个非负整数,依次表示各队的最后得分。
输入保证20%的数据满足N≤4,40%的数据满足N≤6,60%的数据满足N≤8,100%的数据满足3≤N≤10.
输出描述 Output Description
输入答案mod 10^9+7
样例输入 Sample Input
4
4 3 6 4
样例输出 Sample Output
3
其实想一想,还真是那个道理,不是你不懂,是你不敢去做,不敢去想
每一个对于一个得分序列,不管怎么交换,都不会影响答案,所以我们可以用记忆化搜索,hash一下当前的状态
但是这个状态必须是i个人,两两之间都没比赛的情况
我们爆搜每一个人的比赛情况,然后记忆化一下,如果以前已经搜过了,就直接返回答案
看了题解说状态只有40000左右,我就只开了80000的hash
const
h=;
mo=;
var
a,s:array[..]of longint;
nsum,num:array[..]of int64;
next:array[..]of longint;
n,ans,sum,yes,no,tot:longint;
c:array[..]of longint; procedure init;
var
i,j,t:longint;
begin
read(n);
for i:= to n do
begin
read(a[i]);
inc(sum,a[i]);
end;
yes:=sum-n*(n-);
no:=n*(n-)>>-yes;
for i:=n downto do
for j:= to i- do
if a[j]>a[j+] then
begin
t:=a[j];
a[j]:=a[j+];
a[j+]:=t;
end;
end; function hash(x:int64):longint;
begin
exit(trunc(x* mod h));
end; function find(x:int64):boolean;
var
i:longint;
begin
i:=hash(x);
while i<> do
begin
if num[i]=x then exit(true);
i:=next[i];
end;
exit(false);
end; procedure insert(s,x:int64);
var
i:longint;
begin
i:=hash(s);
while (num[i]<>s)and(next[i]<>) do
i:=next[i];
if num[i]=s then nsum[i]:=(nsum[i]+x)mod mo
else
begin
inc(tot);
next[i]:=tot;
num[tot]:=s;
nsum[tot]:=x;
end;
end; function get(x:int64):int64;
var
i:longint;
begin
i:=hash(x);
while (num[i]<>x)and(next[i]<>) do
i:=next[i];
if num[i]=x then exit(nsum[i])
else exit();
end; function dfs(x,y:longint):int64;
var
i,j,xi,yi:longint;
ss:int64;
begin
if x=n then exit();
if y=x+ then
begin
ss:=;
fillchar(c,sizeof(c),);
for i:=x to n do
inc(c[a[i]-s[i]]);
for i:= downto do
for j:= to c[i] do
ss:=ss*+i;
if find(ss) then exit(get(ss));
end;
dfs:=;
if (s[x]+(n-y+)*<a[x])or(s[x]+yes*+(n-y+-yes)<a[x]) then exit(dfs);
if y=n then
begin
xi:=x+;
yi:=xi+;
end
else
begin
xi:=x;
yi:=y+;
end;
if yes> then
begin
if s[x]+<=a[x] then
if (y<n)or((y=n)and(s[x]+=a[x])) then
begin
dec(yes);
inc(s[x],);
dfs:=(dfs+dfs(xi,yi))mod mo;
inc(yes);
dec(s[x],);
end;
if s[y]+<=a[y] then
if (y<n)or((y=n)and(s[x]=a[x])) then
begin
dec(yes);
inc(s[y],);
dfs:=(dfs+dfs(xi,yi))mod mo;
inc(yes);
dec(s[y],);
end;
end;
if no> then
if (s[x]+<=a[x])and(s[y]+<=a[y]) then
if (y<n)or((y=n)and(s[x]+=a[x])) then
begin
dec(no);
inc(s[x]);
inc(s[y]);
dfs:=(dfs+dfs(xi,yi))mod mo;
inc(no);
dec(s[x]);
dec(s[y]);
end;
if y=x+ then insert(ss,dfs);
end; begin
init;
tot:=h;
write(dfs(,));
end.
3139:[HNOI2013]比赛 - BZOJ的更多相关文章
- bzoj 3139: [Hnoi2013]比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...
- 【BZOJ】3139: [Hnoi2013]比赛
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3139 可以发现,答案之和得分的序列有关,而且和序列中每个元素的顺序无关.考虑HASH所有的 ...
- BZOJ.3139.[HNOI2013]比赛(搜索 Hash)
题目链接 不会搜索了.. DFS()中两个参数,枚举每两个队伍的比赛结果(分配当前队伍的分数). 可以发现方案数量与具体哪只球队得了多少分无关,只与当前比赛的队伍数量和得分序列的组成有关.可以记忆化搜 ...
- [BZOJ3139][HNOI2013]比赛(搜索)
3139: [Hnoi2013]比赛 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1439 Solved: 719[Submit][Status] ...
- 【BZOJ3139】[HNOI2013]比赛(搜索)
[BZOJ3139][HNOI2013]比赛(搜索) 题面 BZOJ 洛谷 题解 双倍经验
- [HNOI2013]比赛 (用Hash实现记忆化搜索)
[HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...
- [HNOI2013]比赛 搜索
[HNOI2013]比赛 搜索. LG传送门 直接暴力有60,考场上写的60,结果挂成40. 考虑在暴力的同时加个记忆化,把剩下的球队数和每支球队的得分情况hash一下,每次搜到还剩\(t\)个队的时 ...
- 【题解】HNOI2013比赛
[题解][P3230 HNOI2013]比赛 将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的.这个表格之前是正方形的,后来长宽都减去一,还是正方形.问题形式是递归的.这就启示我们可以把这 ...
- BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
随机推荐
- C#中Messagebox.Show()常用参数用法详解
声明:IWin32Window owner , HelpNavigator navigator , string keyword 上面的三个参数类型不是很了解.没有做讨论. 等以后了解多了 ...
- ORACLE-树状数据结构获取各层级节点信息
平时工作中出报表时,要求分别列出员工的一级部门,二级部门....,在数据库中,部门表(unit)的设计一般为在表中维护每个部门的上级部门(pid字段),或者通过一个关联表(unit_link)维护层级 ...
- Xcode中使用插件
有两种添加插件的方法.推荐第二种 一.就是在Github上找到你要安装的插件,然后在Xcode完全退出后,打开你要安装的插件,编译就行了,然后完全退出后,重新打开Xcode,会出来这个图 点击load ...
- C#代码配置IIS 操纵IIS
前言: IIS到目前经历了四个版本分别为 IIS4.0 IIS5.0 IIS6.0 IIS7.0,其中IIS6.0 IIS7.0是在5.0的安全问题的基础上获得的发展,目前为止.6.0版本以后的都是 ...
- VxWorks 6.9 内核编程指导之读书笔记 -- C++开发
5.1 介绍 针对C++的VxWorks配置 C++头文件 使用C++启动任务 C和C++之前调用代码 C++编译器说明 在信号处理和ISR中使用C++ 下载C++编写的内核模块 C++编译器的不同 ...
- JQuery自定义属性的设置和获取
Jquery操作自定义属性的方法,很简洁: $("#test").attr("test","aaa") // 设置 $("#tes ...
- Windows Phone 7 ListBox 列表项渐显加载动画学习笔记
在wp7程序中,当程序功能越来越复杂时,性能问题是我们不得不考虑的一个问题.在聊天列表中,如果聊天项过多,而且项目UI组件足够复杂时, 我们不得不想尽办法让UI尽快加载.所以有一种可行的方案,就是像Q ...
- Mysql表基本操作
一. 创建表的方法 语法:create table 表名( 属性名数据类型完整约束条件, 属性名数据类型条完整约束件, ......... 属性名数据类型 ); (1)举例:1 create tabl ...
- 《DNS服务缓存的建立》RHEL6
安装dns软件包: 启动dns服务器 配置本地服务器dns域名解析: 查看dns的服务的端口是否打开: 解析百度测试: 安装dns缓存包: 再次访问解析百度
- JS对select动态添加options操作[IE&FireFox兼容]
<select id="ddlResourceType" onchange="getvalue(this)"> </select> 动态 ...