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的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
随机推荐
- iOS UIView简单缩放动画
@interface ViewController () { UIView *animationView; UIButton *button; CGPoint animationPoint; } @e ...
- ubuntu启动失败the system is running in low graphics mode
ubuntu启动失败the system is running in lowg raphics mode 起因 ubuntu重新设置selinux的模式 修改配置文件/etc/selinux/conf ...
- Windows2003计划任务设置操作手册
任务需要重复执行,windows操作系统可以通过 任务计划的配置 达到效果:以下以windowsServer2003为例 1. Windows Server 2003 系统进入控制面板-任务计划 2. ...
- C#DataTable 的一些操作经常操作
关于C# DataTable 的一些操作 经常操作DATATABLE 对于一些不需要再通过sql 来重复操作的 可以通过操作datatable来达到同样的效果 方法一: 也是广为人知的一种: Y ...
- 20150309—bs的保存状态
http:保存状态方式,传值方式 session:(会话) 默认过期时间20分钟(20分内无任何操作自动销毁),针对用户独立,一般用来存储少量信息的 存值:session[“name”]=data;( ...
- 《Apache之虚拟主机的配置》——RHEL6.3
1.安装httpd软件包: Yum install httpd 2.启动apache服务: [root@redhat Desktop]# /etc/init.d/httpd start Startin ...
- 去除wordpress由代发
在服务器上安装好wordpress后,通过程序发送邮件却显示...由<www@hostname>代发,解决办法很简单:进入程序文件夹wp-includes修改pluggable.php文件 ...
- 开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图
先上图吧 卡卡的全是在tty1 下的操作,看电影,听歌,截图 ,看图 ,上irc 等等,相当适合在小白面前装屁! 需要安装的软件: 为了能正常显示中文:安装fbterm sudo apt-get i ...
- Linux下iftop网卡流量监控使用
在类linux系统中可以使用top查看系统资源.进程.内存占用等信息.查看网络状态可以使用netstat.nmap等工具.若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop. 一.i ...
- 【Qt】QWidget、QDialog、QMainWindow的异同点【转】
简述 在分享所有基础知识之前,很有必要在这里介绍下常用的窗口-QWidget.QDialog.QMainWindow. 熟悉Qt的同学都应该知道,在新建Qt Widgets项目进行类信息选择时会碰到它 ...