COCI2017-2018-2 San
题意
有\(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<int,int> 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<b.v;}
int main()
{
scanf("%d%lld",&n,&c);
for(int i=1;i<=n;++i) scanf("%d%d",&H[i],&v[i]),o[i]=H[i];
sort(o+1,o+n+1);for(int i=1;i<=n;++i) p[o[i]]=p[o[i-1]]+(o[i]>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<cnt[0]){
while(ct2<=cnt[1]&&a[1][ct2].v+a[0][ct1].v<c) --lis[a[1][ct2].h],++ct2;
ans+=cnt[1]-ct2+1;
for(int i=0;i<=n;++i) if(H[i]<a[0][ct1].h) ans-=lis[H[i]];
++ct1;
}printf("%lld\n",ans);
return 0;
}
COCI2017-2018-2 San的更多相关文章
- COCI2017/2018 CONTEST #7
Prosjek 显然,越大的数应该越后参与平均数的计算,这样受较小数的影响就小一些 那我们就排个序,贪心的从最小的数开始往大的计算平均数即可 时间复杂度\(O(nlogn)\) Timovi 把分组分 ...
- San(COCI2017.2)题解
题意 一个人为了楼顶的金币要去跳楼,但是不能往更矮的楼上跳. 求在一个长为N的序列中总点权值和大于等于K的不下降序列数. N<=40,K<=4e10 官方题解 折半搜索的经典例子!N在20 ...
- Gartner 2018 数据库系列报告发布 巨杉数据库连续两年入选
近期,Gartner陆续发布了2018年的数据库系列报告,包括<数据库魔力象限><数据库核心能力>以及<数据库推荐报告>.其中,SequoiaDB巨杉数据库作为业界 ...
- Gartner 2018 年WAF魔力象限报告:云WAF持续增长,Bot管理与API安全拥有未来
Gartner 2018 年WAF魔力象限报告:云WAF持续增长,Bot管理与API安全拥有未来 来源 https://www.freebuf.com/articles/paper/184903.ht ...
- Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细心讲解)
layout: post title: Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细 ...
- NAS与SAN
1. NAS(Network Attached Storage,网络附加存储服务器) 简单地说,NAS就是一台File Server,只要将NAS连接上网络,那么在网络上面的其他主机就能够访问NAS上 ...
- Raid与DAN、SAN、NAS基础
一. 磁盘基本知识 1. Raid分类 Raid磁盘阵列是由多个磁盘组合成的磁盘组,可将数据分割成许多区段,分别存放在各个磁盘上:同时利用不同排列技术,可提高磁盘性能和数据安全性.下列简单介绍几种Ra ...
- 2018. The Debut Album
http://acm.timus.ru/problem.aspx?space=1&num=2018 真心爱过,怎么能彻底忘掉 题目大意: 长度为n的串,由1和2组成,连续的1不能超过a个,连续 ...
- Math.abs(~2018),掌握规律即可!
Math.abs(~2018) 某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识. 对于 JS Math对象没什么可说 ...
- HP SAN Switch參考文檔地址
HP SAN Switch其實也是基於Linux內核 http://h20566.www2.hpe.com/portal/site/hpsc/template.PAGE/public/psi/manu ...
随机推荐
- iOS学习笔记(4)——显示单组件选取器
1. 创建工程 创建新工程,create a new Xcode project 创建single view application 创建名为PickerViewTest的工程 2. 创建xib文件 ...
- SpringCloud学习笔记(一)——基础
什么是微服务架构 简单地说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进 ...
- Matplotlib的初次使用
# -*- coding: utf-8 -*-#先画一个线性图 import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] p ...
- Python抓取远程文件获取真实文件名
用urllib下载远程文件并转存到hdfs服务器,在下载时,下载地址中不一定包含文件名,需要从连接信息中获取. 1 file_url = request.form.get('file_url') 2 ...
- Codeforces Round #555 (Div. 3) D. N Problems During K Days 【数学思维】
一 题面 D. N Problems During K Days 二 分析 对于这题,刚开始我就是陷入了对公式的执着,企图用公式直接确定第一个数,然后试着去找序列.经过思考和手动模拟后发现是很难保证正 ...
- Web安全学习笔记——SQL注入
一.MySQL注入 1. 常用信息查询 常用信息: 当前数据库名称:database() 当前用户:user() current_user() system_user() 当前数据库版本号:@@ver ...
- js实现瀑布流布局
window.onload = function () { var d1 = new Waterfall(); d1.init();};//构造函数function Waterfall() { thi ...
- JS中typeof和instanceof的用法和区别
typeof和instanceof的区别 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的 instanceof的用法 instanceof返回的是一个布尔值 ...
- linux centos 7.5 安装mysql5.7
1 下载tar包,这里使用wget从官网下载(注:下载地址随时可能有变动,wget命令默认下载目录为当前所在文件夹) wget https://dev.mysql.com/get/Downloads/ ...
- mysql在查询结果列表前添加一列递增的序号列(最简)
SELECT @rownum:=@rownum+1 AS 序号, t_user.* FROM t_user ,(SELECT @rownum:=0) r -- 最简写法1 更多写法供参考: ① ...