【题解】[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比赛的更多相关文章

  1. 【BZOJ3139】[HNOI2013]比赛(搜索)

    [BZOJ3139][HNOI2013]比赛(搜索) 题面 BZOJ 洛谷 题解 双倍经验

  2. [HNOI2013]比赛 (用Hash实现记忆化搜索)

    [HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...

  3. [HNOI2013]比赛 搜索

    [HNOI2013]比赛 搜索. LG传送门 直接暴力有60,考场上写的60,结果挂成40. 考虑在暴力的同时加个记忆化,把剩下的球队数和每支球队的得分情况hash一下,每次搜到还剩\(t\)个队的时 ...

  4. [BZOJ3139][HNOI2013]比赛(搜索)

    3139: [Hnoi2013]比赛 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1439  Solved: 719[Submit][Status] ...

  5. BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]

    地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...

  6. [BZOJ3139][HNOI2013] 比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下:  (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各 ...

  7. 3139:[HNOI2013]比赛 - BZOJ

    题目描述 Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联赛共N只队伍参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支 ...

  8. P3230 [HNOI2013]比赛

    $ \color{#0066ff}{ 题目描述 }$ 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. ...

  9. bzoj 3139: [Hnoi2013]比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...

随机推荐

  1. 某考试 T2 Tree

    2 树 2.1 题目描述 给一棵n 个节点的树,节点分别编号为0 到n - 1.你可以通过如下的操作来修改这棵树:首先先删去树上的一条边,此时树会分裂为两个连通块,然后在两个连通块之间加上一条新的边使 ...

  2. NOI模拟题5 Problem A: 开场题

    Solution 注意到\(\gcd\)具有结合律: \[ \gcd(a, b, c) = \gcd(a, \gcd(b, c)) \] 因此我们从后往前, 对于每个位置\(L\), 找到每一段不同的 ...

  3. 2016北京集训测试赛(十)Problem A: azelso

    Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...

  4. linux svn co 重新迁出

    在linux环境下,使用svn co (即svn checkout) 报svn: Authorization failed错误, 使用svn co svn://localhost/temp.cc /d ...

  5. 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)

    前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...

  6. 聊聊、Zookeeper Linux 启动

    Zookeeper 在 windows 下安装比较简单,属于无脑式安装,下载下来双击脚本就可以了.前面的文章中也有介绍,今天我来写写 Linux 下的安装,以及所碰到的坑. 首先,登陆 Linux 系 ...

  7. ylbtech-czgfh(规范化)-数据库设计

    ylbtech-DatabaseDesgin:ylbtech-czgfh(规范化)-数据库设计 DatabaseName:czgfh(财政规范化) Model:账户模块.系统时间设计模块.上报自评和审 ...

  8. 安装XAMPP时出现 unable to realloc 83886080 bytes

    参考:https://www.apachefriends.org/faq_linux.html 转载:http://blog.xinspace.space/2015/08/06/xampp-unabl ...

  9. c语言单链表实现

    /************************************************************************* > File Name: singleLin ...

  10. GetDlgItem() 出现错误

    写MFC程序ASSERT(IsWindow(pTemp->m_hWnd))报错 CRect rect; CWnd *pWnd = GetDlgItem(IDC_picture);//IDC_pi ...