suoi62 网友跳 (暴搜+dp)
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)的更多相关文章
- codeforces 339C Xenia and Weights(dp或暴搜)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Xenia and Weights Xenia has a set of weig ...
- 子矩阵(暴搜(全排列)+DP)
子矩阵(暴搜(全排列)+DP) 一.题目 子矩阵 时间限制: 1 Sec 内存限制: 128 MB 提交: 1 解决: 1 [提交][状态][讨论版] 题目描述 给出如下定义: 1. 子矩阵:从一 ...
- [noip2016]愤怒的小鸟<状压dp+暴搜>
题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...
- Codeforces 1519F - Chests and Keys(暴搜+以网络流为状态的 dp)
Codeforces 题目传送门 & 洛谷题目传送门 难度终于出来了--又独立切掉一道 *3200,凯信(所以我已经独立切掉三道 *3200 了?) 首先考虑我们已经知道了每个宝箱上有哪些锁, ...
- HDU 4284 Travel (Folyd预处理+dfs暴搜)
题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不 ...
- NOIP 2011 Mayan游戏 大暴搜
题目链接:https://www.luogu.org/problemnew/show/P1312 我的第一篇题解!! 当然感谢ZAGER 的提示,他的链接https://www.cnblogs.com ...
- P4799 [CEOI2015 Day2]世界冰球锦标赛(折半暴搜)
题目很明确,不超过预算的方案数.两个直觉:1.暴搜2.dp 每个点两种状态,选或不选.... 1.可过20% 2.可过70% 正解:折半搜索(meet in the middle) 有点像以前的双向广 ...
- hdu4848 DFS 暴搜+ 强剪枝
题意: 给你一个图,然后问你从1出发遍历所有的点的距离和是多少,这里的距离和是每一个点到1的距离的总和,不是选择一条遍历所有点的路径的总长度,时间限制是 8000ms. 思路: ...
- 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜
3033: 太鼓达人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 204 Solved: 154[Submit][Status][Discuss] ...
随机推荐
- 如何使用nodejs快速搭建本地服务器
1.首先要安装好node,js 2.以下有安装包下载的链接:这里的安装包是.msi,如果要其他的,可以到菜鸟教程上去找 32 位安装包下载地址 : https://nodejs.org/dist/v4 ...
- GIT的前世今生
在重点介绍GIT的一些操作之前,我们首先来说一说GIT的前世今生,了解整个版本控制的变迁能够让我们知道该如何去选择这些工具,另外通过这些技术的变迁也能够让我们对现在的技术有着更加深入的理解,在正式介绍 ...
- WPF中关于对前台Xaml中Triggers的一些重要思考。
今天在做一个小Demo的时候碰到了一个比较奇怪的问题,就是其中一个Trigger始终无法执行,<Trigger Property="Popup.IsOpen" Value=& ...
- Java线程的5种状态及切换(透彻讲解)-京东面试
一.Thread的几个重要方法: 我们先了解一下Thread的几个重要方法. a.start()方法,开始执行该线程:b.stop()方法,强制结束该线程执行:c.join方法,等待该线程结束.d.s ...
- python数据结构与算法第三天【时间复杂度计算方法】
最优时间复杂度(不可靠) 最坏时间复杂度(保证) 平均时间复杂度(平均状况) 不同语句的时间复杂度: (1)顺序语句:使用加法 (2)循环语句:使用乘法 (3)分支语句:使用坏时间复杂度 例如:如下代 ...
- delphi中退出是弹出让你确定的几种确定对话框怎么写?
procedure TForm2.btn1Click(Sender: TObject); begin if MessageBox(Handle, '你确定要退出系统吗?', '信息提示', MB_OK ...
- How to recovery compiz
sudo apt install compizconfig-settings-manager dconf reset -f /org/compiz/ setsid unity dconf list / ...
- codeforces509B
Painting Pebbles CodeForces - 509B There are n piles of pebbles on the table, the i-th pile contains ...
- 基于OpenCv和swing的图片/视频展示Java实现
基于OpenCv和swing实现图片/视频的展示 图片的展示 swing展示图片,多为操作BufferedImage,这里要关注的核心是将Mat转为BufferedImage. 代码如下: publi ...
- linux-shell系列4-init
#!/bin/bash # 过滤出MAC地址MAC=`ifconfig |awk '{print $5}'|sed -n '1p;1q'` # 过滤网卡名字NET_NAME=`ifconfig |aw ...