博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
COCI2017-2018-2 San
阅读量:6058 次
发布时间:2019-06-20

本文共 1243 字,大约阅读时间需要 4 分钟。

题意

\(n \leq 40\)个节点,每个节点有权值\(H \leq 1e9\)和贡献\(v \leq 1e9\),从任意一个点可以向右跳到一个权值不小于它的节点,并获得该点贡献

可以从任意一个点开始,任意一个点结束

看数据范围可知此题是典型的折半搜索

方法:离散化高度后将数据分为左右两部分,分别DFS出两边的合法状态,然后排序考虑合并

左半部从大到小排序,右半部从小到大排序,统计右半部的各种高度前缀和

双指针从左往右扫,统计合法的方案数

#include"cstdio"#include"cstring"#include"iostream"#include"algorithm"#include"map"using namespace std;const int MAXN=45;int n,np,mid,o[MAXN];long long c,ans;int H[MAXN],v[MAXN],cnt[2];int lis[MAXN];map
p;struct rpg{ long long v; int h;}a[2][1<<20];void dfs1(long long val,int h,int tp){ a[0][++cnt[0]]=(rpg){val,h}; if(tp==mid) return; for(int i=tp+1;i<=mid;++i) if(H[i]>=h) dfs1(val+v[i],H[i],i); return;}void dfs2(long long val,int lh,int h,int tp){ a[1][++cnt[1]]=(rpg){val,lh}; if(tp==n) return; for(int i=tp+1;i<=n;++i) if(H[i]>=h) dfs2(val+v[i],lh?lh:H[i],H[i],i); return;}bool cmp1(rpg a,rpg b){return a.v>b.v;}bool cmp2(rpg a,rpg b){return a.v
o[i-1]); for(int i=1;i<=n;++i) H[i]=p[H[i]]; mid=1+n>>1;dfs1(0,0,0);dfs2(0,0,0,mid); sort(a[0]+1,a[0]+cnt[0]+1,cmp1); sort(a[1]+1,a[1]+cnt[1]+1,cmp2); a[1][1].h=41;for(int i=1;i<=cnt[1];++i) ++lis[a[1][i].h]; int ct1=1,ct2=1; while(ct1

转载于:https://www.cnblogs.com/AH2002/p/9917744.html

你可能感兴趣的文章
mongodb用户权限操作常用命令
查看>>
MyBatis中XML 映射配置文件的简单介绍
查看>>
Springcloud基础开发框架
查看>>
android基础知识12:android自动化测试06—Instrumentation 03 技术概要
查看>>
Nginx upstream的几种分配方式
查看>>
Java减肥高手Xtend 捆绑Eclipse IDE
查看>>
iPhone开发中现文件的增加 删除和查询
查看>>
简单shell脚本练习
查看>>
关于webpack中<%= htmlWebpackPlugin.options.title %> 无法解析的原因
查看>>
javascript关于forEach使用方式
查看>>
eclipse luna 配置tomcat
查看>>
Struts1.x系列教程(2):简单的数据验证
查看>>
我的友情链接
查看>>
git常用命令
查看>>
优先队列总结(堆)
查看>>
如何取出每个分组的第一条记录
查看>>
ucos-4-任务调度2
查看>>
Java设计模式之综述篇
查看>>
mysql优化
查看>>
8款最新CSS3表单 环形表单很酷
查看>>