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的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
随机推荐
- PAT1015—— 德才论
宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人 ...
- Part 7 Joins in sql server
Joins in sql server Advanced or intelligent joins in sql server Self join in sql server Different wa ...
- Swiper之滑块1
之前介绍过Swiper,它是一个神奇的插件.类似于Android的触屏操作,Swiper应用于Web中也可以实现这样的效果,我们来看看(用鼠标可拖动). startSlide Integer (def ...
- MySQL 数据类型 详解 (转载)
数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指 ...
- 【原创】如何找到Oracle中哪条记录被锁
通常有这种情况,某个表或者准确的说是表的某条记录被锁(TX锁),在业务层面排查之余,一般都会想知道是哪条记录被锁,每次被锁的是否是同一条记录?还是每次都不同?通过记录可以找到这条记录可以在哪个模块.哪 ...
- PHP的接口(interface)
接口声明了函数和字段,但不会给出实现的细节 规则: 1.类全部为抽象方法(不需要声明abstract) 2.接口抽象方法必须是public 3.成员(字段)必须是常量 interface Comput ...
- 字符集转换: Unicode - Ansi
字符集转换: Unicode - Ansi string UnicodeToAnsi ( const wstring& wstrSrc ) { /*!< 分配目标空间, 一个16位Uni ...
- PowerDesigner数据库建模工具一缆
转自:http://blog.csdn.net/shanliwa/archive/2007/10/20/1834117.aspx Sybase PowerDesigner - 一个高端数据建模工具.你 ...
- js中字符和数组一些基本算法题
最近在刷 fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的.今天抽时间把 Basic Algorithm Scritping 这部分题做了,根据一些提示,还是比较简单的.有些题的处理方式 方法 ...
- Word 录制宏解决粘贴网络上文字格式错乱
本文将利用Word中的录制宏来解决 复制粘贴网络上文字格式错乱的问题. 本文宏代码取自 : 知乎 李文超,感谢他的提供. Technorati 标签: Word宏 格式修正 1 ...