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的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
随机推荐
- Intent进行组件通信的一些体会
Intent进行组件通信的原理 l Intent协助应用间的交互与通讯 Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述.Android则根据此Intent的描述,负责找到对应 ...
- CPU 硬盘性能到底相差多少
本文以一个现代的.实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据吞吐量.通过粗略的估算PC各个组件的相对运行速度,希望能给 ...
- Python 网页爬虫
解决问题:获取网页上的内容.特别是加载主框架后,再用AJAX获取数据生成内容的网页. PyQuery:可以像jQuery的py实现.你给他一个PyQuery一个HTML,他给你一个类似jQuery的操 ...
- js中字符和数组一些基本算法题
最近在刷 fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的.今天抽时间把 Basic Algorithm Scritping 这部分题做了,根据一些提示,还是比较简单的.有些题的处理方式 方法 ...
- nginx配置多个网址
实战Nginx与PHP(FastCGI)的安装.配置与优化:http://ixdba.blog.51cto.com/2895551/806622 Nginx配置文件详细说明:http://www.cn ...
- CentOS学习笔记--程序管理
程序管理 一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为程序(process).程序是操作系统上非常重要的概念, 所有系统上面跑的数据都会以程序的型态存在.那么系统的程序有哪些状态?不同 ...
- C#操作Excel基本操作
/// using Microsoft.Office.Core; using Microsoft.Office.Interop.Excel; using System.IO; using System ...
- DataGridView导入导出excel
DataGridView导出到Excel #region 方法一 DateGridView导出到csv格式的Excel /// <summary> /// 导出数据到Excel.常用方法, ...
- Nginx+Keepalived实现高可用站点
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat. corosync.pacemaker.但是它一般不会单独出现,而是与 ...
- 集成环境wamp环境下 memcached的安装
早就听说过memcached,但是一直没实践过.所有今天有时间就搞了一下,哎废了我一上午才搞定!一上午啊,好丢人.特写记录一下 先说一下我遇到的问题:按照别人教程(还有好多)说的,安装后没有任何的错误 ...