[loj3503]滚榜
一个小问题:题意中关于$b_{i}$的顺序只需要单调不降即可,相同时可任意选择
考虑$i$优于$j$的条件,即$val_{i}\ge val_{j}+[i>j]$,并记$del_{i,j}=\max(a_{i}+[i<j]-a_{j},0)$
先考虑暴力$o(n!)$枚举最终的排名排名$p_{i}$(其中$p_{1}$为第一名),并判定其是否合法
根据题目的描述,即要求存在$b_{i}$,满足:
1.$\sum_{i=1}^{n}b_{i}=m$且$b_{p_{n}}\le b_{p_{n-1}}\le ...\le b_{p_{1}}$
2.$\forall 1\le i<n,a_{p_{i}}+b_{p_{i}}\ge a_{p_{i+1}}+b_{p_{i+1}}+[p_{i}>p_{i+1}]$
3.$\forall 1\le i<j\le n,a_{p_{j}}+b_{p_{j}}\ge a_{p_{i}}+[p_{j}>p_{i}]$
注意到除去$\sum_{i=1}^{n}b_{i}=m$以外,其余条件都限制的是$b_{i}$之差,同时增加$b_{p_{1}}$并不影响后者,换言之每一个$b_{i}$一定取其所有限制条件中的最小值,最终通过调整(增大)$b_{p_{1}}$使其恰等于$m$即可
更具体的来说,对于$1\le i<n$时,满足$b_{p_{i}}=\max(\max_{1\le j<i}del_{p_{j},p_{i}},b_{p_{i+1}}+del_{p_{i+1},p_{i}})$
(特别的,$b_{p_{n}}=\max_{i=1}^{n}del_{i,p_{n}}$)
求出$b_{i}$后,将其累加并判定是否小于等于$m$即可
关于这个的计算,可以从后往前,前者的$p_{j}$即所有未出现的元素,同时由于$[p_{i}>p_{j}]$的影响至多为1,必然是在$a_{p_{j}}$最大的基础上选择$p_{j}$最小的,可以$o(2^{n})$预处理出
综上,即得到一个$o(n!)$的做法,显然无法通过
事实上,对于$1\le i<n$,还满足$\max_{1\le j<i}del_{p_{j},p_{i}}\le b_{p_{i+1}}+del_{p_{i+1},p_{i}}$,换言之,即$\max$一定选择后者
证明比较简单,假设前面最大值在$p_{j}=k$处取到,那么有$b_{p_{i+1}}\ge del_{k,p_{i+1}}$,且前者恰为$del_{k,p_{i}}$
代入后,若前者结果为0,则必然小于等于后者,后者去除max后单调不递增,因此都可以去除,取出后对其抵消即得到$[p_{i}>p_{k}]\le [p_{i+1}>k]+[p_{i}>p_{i+1}]$
对其进行分类讨论,不难得到该式恒成立,即得证
最终,即有$b_{p_{i}}=b_{p_{i+1}}+del_{p_{i+1},p_{i}}$(这里可能还需要从后往前归纳一下,且$b_{p_{n}}$不变),那么即有$\sum_{i=1}^{n}b_{i}=\sum_{i=1}^{n-1}i\cdot del_{p_{i+1},p_{i}}+n\max_{1\le i\le n}del_{i,p_{n}}$
现在,即可状压dp,即$f_{S,i,j}$表示满足以下条件的排列数:$\{p_{1},p_{2},...,p_{|S|}\}=S$,$p_{|S|}=i$且$1\le i\le |S|$在上式中和为$j$
转移枚举下一个元素,即$f_{S\cup\{x\},x,j+|S|del_{x,i}}=\sum_{x\notin S}f_{S,i,j}$,最后再计算$n\max_{1\le i\le n}del_{i,p_{n}}$对答案的影响即可(即要求$j\le m-n\max_{1\le i\le n}del_{i,p_{n}}$)
最终计算复杂度为$o(n^{2}m2^{n})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 13
4 #define M 505
5 #define ll long long
6 int n,m,a[N],b[N],tot[1<<N];
7 ll ans,f[1<<N][N][M];
8 int del(int x,int y){
9 return max(a[x]+(y>x)-a[y],0);
10 }
11 int main(){
12 scanf("%d%d",&n,&m);
13 for(int i=0;i<n;i++)scanf("%d",&a[i]);
14 for(int i=0;i<(1<<n);i++)tot[i]=tot[i>>1]+(i&1);
15 for(int i=0;i<n;i++)f[1<<i][i][0]=1;
16 for(int i=1;i<(1<<n);i++)
17 for(int j=0;j<n;j++)
18 if (i&(1<<j)){
19 for(int x=0;x<n;x++)
20 if (!(i&(1<<x))){
21 int s=tot[i]*del(x,j);
22 for(int k=s;k<=m;k++)f[i^(1<<x)][x][k]+=f[i][j][k-s];
23 }
24 }
25 int mx=0;
26 for(int i=1;i<n;i++)
27 if (a[i]>a[mx])mx=i;
28 for(int i=0;i<n;i++)
29 for(int j=0;j<=m-n*del(mx,i);j++)ans+=f[(1<<n)-1][i][j];
30 printf("%lld",ans);
31 }
[loj3503]滚榜的更多相关文章
- [TJOI2019]甲苯先生的滚榜——非旋转treap
题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. ...
- 洛谷P5338 [TJOI2019]甲苯先生的滚榜
原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...
- LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap
问题描述 LG5338 LOJ3105 BZOJ5509 题解 建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\) 原来的比较\(val_a<va ...
- BZOJ5509: [Tjoi2019]甲苯先生的滚榜
题解 开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可. 其实挺好写的...就是评测的时候评的巨久... #include <bits/stdc++.h> using n ...
- 【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜
原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在 ...
- 「TJOI2019」甲苯先生的滚榜
题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC ...
- luogu P5338 [TJOI2019]甲苯先生的滚榜
传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个 ...
- 百度音乐api
百度音乐全接口 会利用使用接口找歌简单又快捷 http://tingapi.ting.baidu.com/v1/restserver/ting 获取方式:GET 参数:format=json或xml& ...
- ACM退役记&&回忆录
ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这 ...
随机推荐
- css超出隐藏显示省略号怎么设置?
当我们在进行网页前端开发的时候,一般获取文章标题,然后一行一行的显示.但是当标题过长的时候,就会造成换行显示.还有显示部分文本信息时,如果全部显示就过于繁琐,会带来不会的网页体验感.虽然我们可以使用o ...
- Rafy 框架 - 实体支持只更新部分变更的字段
Rafy 快一两年没有大的更新了.并不是这个框架没人维护了.相反,主要是因为自己的项目.以及公司在使用的项目,都已经比较稳定了,也没有新的功能添加.但是最近因为外面使用了 Rafy 的几个公司,找到我 ...
- 题解 [HAOI2018]反色游戏
题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条无向边的图,每个点都有一个 \(\in [0,1]\) 的权值,每次可以选择一条边,然后将该边相连两点权值异或上 \(1\).问有多少种 ...
- python函数参数类型:位置参数、默认参数、动态参数、关键字参数
1.位置参数:调用函数的时候传的参数,参数默认按顺序赋值,如果是指定那个参数赋值,不关注顺序.指定参数a=1,b=2 就在函数体内a=1,b=2 2.默认参数:在定义函数的时候,给某个参数设置默认值 ...
- python之字符串,列表,集合,字典方法
字典内置函数&方法 函数: 1.len(dict1):打印字典的键的个数 方法:dict1.( ) 2.clear():清空字典 3.copy():复制字典 4.fromkeys():使用指定 ...
- 【UE4 C++】读写Text文件 FFileHelper
CoreMisc.h 读取 FFileHelper::LoadFileToString 读取全部内容,存到 FString FString TextPath = FPaths::ProjectDir( ...
- 周末愉快--css画大熊猫
周末找了点轻松的话题,css画大熊猫. 先上效果图 欢迎竞猜大熊猫到底说了什么?? 再上源码 <!DOCTYPE html> <html lang="en"> ...
- Java:AQS 小记-1(概述)
Java:AQS 小记-1(概述) 概述 全称是 Abstract Queued Synchronizer(抽象队列同步器),是阻塞式锁和相关的同步器工具的框架,这个类在 java.util.conc ...
- JVM:类加载与字节码技术-1
JVM:类加载与字节码技术-1 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 类文件结构 字节码指令 下面的内容在后续笔记中: 编译期处理 类加载阶段 类 ...
- Java:异常小记
Java:异常小记 对 Java 中的 异常 ,做一个微不足道的小小小小记 Error 和 Exception 相同点: Exception 和Error 都是继承了 Throwable 类,在 Ja ...