传送门

sbw太神啦orz

首先N<=20可以直接暴搜

然后玄学剪枝可以过18个点

那么N<=40的时候,就把它拆成两半分别暴搜,再用dp拼起来

对于前半段,设f[i][j]是开始高度为i,获得金币为j的方案数;对于后半段,设g[i][j]是结束高度为i,获得金币为j的方案数(离散化一下高度)

然而V<=4e7,并不能直接记

但其实每一段最多只有$2^{20}$种金币数,状压一下每一位选不选,再预处理出来这样的金币数是多少

然后统计答案,$ans=\sum{g[i][j]*f[k][l]},i>k,v[j]+v[l]>=M$

给f做一个前缀和,给每个状态按v排序,可以$O(n*2^{n/2})$统计答案

然后会MLE,注意到对于每种状态其实每个开始高度/结束高度 都只有选或者不选,做个前缀和最多也只有20

把int改成unsigned char 就行了(逃

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=,maxs=(<<)+;
inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
}
int H[maxn],N,M,v1[maxs],v2[maxs],rk1[maxs],rk2[maxs];
unsigned char f[][maxs],g[][maxs];
void dfs1(int x,int tar,int h,int y){
if(x>tar) return;
dfs1(x+,tar,h,y);
if(H[x]>h) f[H[x]][y|(<<(x-))]++,dfs1(x+,tar,H[x],y|(<<(x-)));
}
void dfs2(int x,int tar,int h,int y){
if(x<tar) return;
dfs2(x-,tar,h,y);
if(H[x]<h) g[H[x]][y|(<<(x-tar))]++,dfs2(x-,tar,H[x],y|(<<(x-tar)));
} inline bool cmp1(int a,int b){return v1[a]<v1[b];}
inline bool cmp2(int a,int b){return v2[a]<v2[b];}
int main(){
// freopen("62.in","r",stdin);
// freopen("62.out","w",stdout);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=N;i++){
rk1[i]=H[i]=rd(),rk2[i]=rd();
}
sort(rk1+,rk1+N+);
int t=unique(rk1+,rk1+N+)-rk1-;
for(i=;i<=N;i++)
H[i]=lower_bound(rk1+,rk1+t+,H[i])-rk1;
int m=N>>;
int n1=(<<m)-,n2=(<<(N-m))-;
dfs1(,m,,);
dfs2(N,m+,,); f[][]=;g[t+][]=;
for(i=;i<=t;i++){
for(j=;j<=n1;j++)
f[i][j]+=f[i-][j];
}
for(i=;i<=n1;i++){
for(j=;j<=m;j++)
if((i>>(j-))&) v1[i]+=rk2[j];
}for(i=;i<=n2;i++){
for(j=;j<=N-m;j++)
if((i>>(j-))&) v2[i]+=rk2[j+m];
}
for(i=;i<=n1;i++) rk1[i]=i;
for(i=;i<=n2;i++) rk2[i]=i;
sort(rk1+,rk1+n1+,cmp1);
sort(rk2+,rk2+n2+,cmp2);
ll ans=;
for(i=;i<=t+;i++){
ll s=;
for(j=,k=n1;j<=n2;j++){
for(;k>=&&v1[rk1[k]]+v2[rk2[j]]>=M;k--)
s+=f[i-][rk1[k]];
ans+=s*g[i][rk2[j]];
}
}
printf("%lld\n",ans);
return ;
}

suoi62 网友跳 (暴搜+dp)的更多相关文章

  1. codeforces 339C Xenia and Weights(dp或暴搜)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Weights Xenia has a set of weig ...

  2. 子矩阵(暴搜(全排列)+DP)

    子矩阵(暴搜(全排列)+DP) 一.题目 子矩阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 [提交][状态][讨论版] 题目描述 给出如下定义: 1. 子矩阵:从一 ...

  3. [noip2016]愤怒的小鸟<状压dp+暴搜>

    题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...

  4. Codeforces 1519F - Chests and Keys(暴搜+以网络流为状态的 dp)

    Codeforces 题目传送门 & 洛谷题目传送门 难度终于出来了--又独立切掉一道 *3200,凯信(所以我已经独立切掉三道 *3200 了?) 首先考虑我们已经知道了每个宝箱上有哪些锁, ...

  5. HDU 4284 Travel (Folyd预处理+dfs暴搜)

    题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不 ...

  6. NOIP 2011 Mayan游戏 大暴搜

    题目链接:https://www.luogu.org/problemnew/show/P1312 我的第一篇题解!! 当然感谢ZAGER 的提示,他的链接https://www.cnblogs.com ...

  7. P4799 [CEOI2015 Day2]世界冰球锦标赛(折半暴搜)

    题目很明确,不超过预算的方案数.两个直觉:1.暴搜2.dp 每个点两种状态,选或不选.... 1.可过20% 2.可过70% 正解:折半搜索(meet in the middle) 有点像以前的双向广 ...

  8. hdu4848 DFS 暴搜+ 强剪枝

    题意:       给你一个图,然后问你从1出发遍历所有的点的距离和是多少,这里的距离和是每一个点到1的距离的总和,不是选择一条遍历所有点的路径的总长度,时间限制是 8000ms. 思路:       ...

  9. 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 154[Submit][Status][Discuss] ...

随机推荐

  1. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in range(128)

    python报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in ...

  2. MySQL的SQL语句优化-group by语句的优化

    原文:http://bbs.landingbj.com/t-0-243202-1.html 默认情况下,MySQL排序所有GROUP BY col1, col2, ....,查询的方法如同在查询中指定 ...

  3. laravel get和all区别

      get ,all 都可以获取到模型 all 是直接获取所有,get 是在添加了许多约束之后获取模型,get前面如果不加约束条件的话,效果与all等同

  4. 【Java基础】for循环实现在控制台打印水仙花数

    代码: /* * 需求:在控制台输出所有的”水仙花数” * * 分析: * 什么是水仙花数呢? * 所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身. * 举例:153就是一个水仙花数. ...

  5. switch-case和if-else可互换时

    当switch-case和if-else可互换时,应当优先采用switch-case.因为switch-case的效率更高(详情下回分解).

  6. Django的模板层

    一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  7. Ajax之Jquery封装使用举例

    <html> <head> <meta charset="UTF-8"> <title>登陆页面</title> < ...

  8. 转 My97日历控件常用功能记录

    My97相信大家都不陌生,应该是我所见过的最强大的一个日历控件了,最近的项目中也比较多地用到了此控件,而且项目中经常会有不同时间范围的需求,在此列出一些比较常用的日期范围格式的设置,尽管在My97的官 ...

  9. 文件操作 chardet使用

    #_*_coding:utf-8_*_ import chardet #f = open(file="兼职白领学生空姐模特护士联系方式.txt", mode="rb&qu ...

  10. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...