【题解】HNOI2013比赛
【题解】[P3230 HNOI2013]比赛
将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的。这个表格之前是正方形的,后来长宽都减去一,还是正方形。问题形式是递归的。这就启示我们可以把这个正方形\(hash\)起来,直接搜索。
平局和胜场可以很显然地算出来,
\(draws=\frac{(n)(n-1)}{2} \times 3-sum\)
\(wins=\frac{n(n-1)}{2}-draws\)
靠这个剪枝。
注意
if(rac[now]+(n-to+1)*3<data[now])
不能是
if(rac[now]+(win)*3<data[now])
也不能是
if(rac[now]+(win)*3+drs<data[now])
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<bitset>
#include<vector>
#include<map>
#include<ctime>
#include<cstdlib>
#include<set>
#include<bitset>
#include<stack>
#include<list>
#include<cmath>
using namespace std;
#define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t)
#define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t)
#define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define TMP template<class ccf>
#define lef L,R,l,mid,pos<<1
#define rgt L,R,mid+1,r,pos<<1|1
#define midd register int mid=(l+r)>>1
#define chek if(R<l||r<L)return
#define all 1,n,1
#define pushup(x) seg[(x)]=seg[(x)<<1]+seg[(x)<<1|1]
typedef long long ll;
TMP inline ccf qr(ccf k){
char c=getchar();
ccf x=0;
int q=1;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
if(q==-1)
x=-x;
return x;
}
const int maxn=17;
ll data[maxn];
ll rac[maxn];
ll n;
ll temp[maxn];
map < ll , ll > mp;
const ll mod=1e9+7;
int f=1;
int drs,win;
inline ll ha(int x){
int cnt=0;
RP(t,x+1,n)
temp[++cnt]=data[t]-rac[t];
sort(temp+1,temp+cnt+1);
ll ret=0;
RP(t,1,cnt)
ret=ret*28+temp[t];
//ret=ret*46+dr;
//ret=ret*46+win;
return ret;
}
inline void com(int x,int y,int k){
if(k==1)
drs--,rac[x]++,rac[y]++;
if(k==3)
win--,rac[x]+=3;
if(k==0)
win--,rac[y]+=3;
}
inline void back(int x,int y,int k){
if(k==1)
drs++,rac[x]--,rac[y]--;
if(k==3)
win++,rac[x]-=3;
if(k==0)
win++,rac[y]-=3;
}
inline bool jde(int x,int y,int k){
com(x,y,k);
if(rac[x]<0||rac[y]<0||rac[x]>data[x]||rac[y]>data[y]||drs<0||win<0)
return 0;
return 1;
}
int dx[]={0,1,3,0};
ll dfs(int now,int to){
if(rac[now]+(n-to+1)*3<data[now])//此处不能是win*3
return 0;
if(now==n)
return 1;
ll ret=0;
if(to>n){
//return dfs(now+1,now+2);
ret=ha(now);
if(mp.find(ret)!=mp.end())
return mp[ret];
else
return mp[ret]=dfs(now+1,now+2);
}
RP(t,1,3){
if(jde(now,to,dx[t]))
ret+=dfs(now,to+1);
back(now,to,dx[t]);ret%=mod;
}return ret;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=qr(1);
win=(n*(n-1))>>1;
drs=0;
RP(t,1,n)
drs+=(data[t]=qr(1));
drs=win*3-drs;
win-=drs;
sort(data+1,data+n+1);
printf("%lld\n",dfs(1,2));
return 0;
}
【题解】HNOI2013比赛的更多相关文章
- 【BZOJ3139】[HNOI2013]比赛(搜索)
[BZOJ3139][HNOI2013]比赛(搜索) 题面 BZOJ 洛谷 题解 双倍经验
- [HNOI2013]比赛 (用Hash实现记忆化搜索)
[HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...
- [HNOI2013]比赛 搜索
[HNOI2013]比赛 搜索. LG传送门 直接暴力有60,考场上写的60,结果挂成40. 考虑在暴力的同时加个记忆化,把剩下的球队数和每支球队的得分情况hash一下,每次搜到还剩\(t\)个队的时 ...
- [BZOJ3139][HNOI2013]比赛(搜索)
3139: [Hnoi2013]比赛 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1439 Solved: 719[Submit][Status] ...
- BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
- [BZOJ3139][HNOI2013] 比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各 ...
- 3139:[HNOI2013]比赛 - BZOJ
题目描述 Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联赛共N只队伍参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支 ...
- P3230 [HNOI2013]比赛
$ \color{#0066ff}{ 题目描述 }$ 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. ...
- bzoj 3139: [Hnoi2013]比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...
随机推荐
- 某考试T1 game
题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...
- JAVA基础之List接口
个人理解: list接口是Collection接口的子类,其继承了Collection接口的所有方法,但也有其独有的方法,不过在迭代的时候不要进行任何操作.牢记数据存储的四种结构:堆栈.队列.数组.链 ...
- 洛谷1373小a和uim之大逃离
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- Jenkins插件HTML Publisher Plugin的使用
前提: 下载插件HTML Publisher plugin 一.安装 安装好HTML Publisher plugin之后,会在新建或者编辑项目时,在[增加构建后操作步骤]出现[Publish HTM ...
- JSONModel解析Dictionary To Model /JSON To Model
你在把字典转成object的时候还在按下面这样: self.id = [jsonDict objectForKey:@"id"]; self.name = [jsonDict ob ...
- python 类和__class__理解
__class__可理解为对象所属的父类 class A: def __init__(self,url): self.url = url def out(self): return self.url ...
- 代码篇之AOP框架
AopFrameworkTest类 public class AopFrameworkTest { public static void main(String[] args) throws Exce ...
- 【前端阅读】——《程序员思维修炼》摘记&读后感&思维导图
前言:这是一本介绍如何用脑的书,并从思维的角度(以程序员为例),介绍如何从新手成为专家.作者带领着读者(我)共同经历一次有关认知科学.神经学.学习和行为理论的旅程,探索人类大脑令人 惊奇的工作的机制, ...
- 转: JDK包含的基本组件
JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品.自从Java推出以来,JDK已经成为使用最广泛的Java SDK.JDK 是整个Java的 ...
- 微信小程序 - 考试状态不同显示
未开考 .已交卷. 考试中 .考试结束 #ddd #f00 #ff0 默认禁用色 禁用的button仅有style起作用,四个状态,通过wx:if ... elif ... e ...