2019HDU多校第六场1009 Three Investigators——杨表
题意
给定一个 n 个元素的数列,从前 k 个元素中取5次不下降子序列,求取得的和的最大值(k从1至n)
分析
考虑将数字 a[i] 拆成 a[i] 个 a[i],比如 “4,1,2”→“4,4,4,4,1,2,2”,则问题转化为:找到最多 5 个不共享元素的不下降子序列,使得这些子序列包含的元素总量最多。可以证明,这等于杨氏图表前 5 层的长度之和。(手动模拟一下就能发现)
考虑杨氏图表求解答案的过程:
- 从 1 到 n 依次考虑序列中的每个数,将其插入杨氏图表的第一层中。
- 插入 x 时,如果 x 不小于这一层的最大的数,则将 x 放在这一层的末尾;否则找到大于 x 的最小的数 y,将 y 替换为 x,并将 y 插入下一层。
因为每一层的元素都有序,所以可以用数组维护,寻找 y 的过程可以用二分查找加速。
但是对于本题来说,我们不能暴力地插入 a[i] 个 a[i]。考虑将杨表每一层中相同的元素合 并,用 std::map 记录每个元素的个数,那么当我们一次性插入 x 个 x 时,只需要将其插入 std::map 中,然后不断消费后继,将后继的元素个数减少即可,在减少的时候要将其作为 “p 个 q” 插入下一层中。 每一类数字被消费完毕后需要及时从 std::map 中删除,而每次插入会导致最多一种其它 数字被拆分,所以每层的插入次数至多为上一层的两倍。
假设要求不超过 k 个子序列的答案,本题中 k = 5,则时间复杂度为 $O(2^kn log n)$。
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int K=;
map<int, ll>T[K];
ll ans;
int n; //在第o行插入p个x
void insert(int o,int x,ll p){
if(o>=K)return;
T[o][x]+=p;
ans+=p;
while(p){
map<int,ll>::iterator it=T[o].lower_bound(x+);
if(it==T[o].end())return;
ll t=min(p,it->second);
ans-=t;
p-=t;
insert(o+,it->first,t);
if(t==it->second)T[o].erase(it);else it->second-=t;
}
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
ans = ;
for(int i=;i<K;i++) T[i].clear();
for(int i = ;i <= n;i++)
{
int tmp;
scanf("%d", &tmp);
insert(, tmp, tmp);
printf("%lld%c", ans, i == n ? '\n' : ' ');
}
}
return ;
}
2019HDU多校第六场1009 Three Investigators——杨表的更多相关文章
- 2018杭电多校第六场1009(DFS,思维)
#include<bits/stdc++.h>using namespace std;int a[100010];char s[20];int zhiren[100010];vector& ...
- 2019HDU多校第六场 6641 TDL——乱搞&&思维题
题意 设 $f(n, m)$ 为大于 $n$ 且与 $n$ 互质的数中第 $m$ 小的数,求满足 $(f(n, m) - n) \oplus n = k$ 的最小正整数 $n$ 分析 因为 $m \l ...
- 2019HDU多校第六场 6641 TDL
一.题目 TDL 二.分析 题意就是找一个$n$满足题目中的公式,找不到就输出$-1$. 对于$${( f (n,m) - n )} \oplus {n} =k$$ 可以转换一下变成$( f (n,m ...
- 2016多校第六场题解(hdu5793&hdu5794&hdu5795&hdu5800&hdu5802)
这场就做出一道题,怎么会有窝这么辣鸡的人呢? 1001 A Boring Question(hdu 5793) 很复杂的公式,打表找的规律,最后是m^0+m^1+...+m^n,题解直接是(m^(n+ ...
- [2019HDU多校第五场][HDU 6626][C. geometric problem]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6626 题目大意:给出平面上六个点\(A,B,M,N,X,Y\)以及两条直线\(L1,L2\),要求在四 ...
- 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)
题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...
- 2014多校第六场 1007 || HDU 4927 Series 1(杨辉三角组合数)
题目链接 题意 : n个数,每操作一次就变成n-1个数,最后变成一个数,输出这个数,操作是指后一个数减前一个数得到的数写下来. 思路 : 找出几个数,算得时候先不要算出来,用式子代替,例如: 1 2 ...
- 2014多校第六场 1005 || HDU 4925 Apple Tree
题目链接 题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两 ...
- 【HDU】4923 Room and Moor(2014多校第六场1003)
Room and Moor Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) ...
随机推荐
- [转帖]nginx location配置详细解释
nginx location配置详细解释 http://outofmemory.cn/code-snippet/742/nginx-location-configuration-xiangxi-exp ...
- Elasticsearch 常用配置参数总结
# ---------------------------------- Cluster ----------------------------------- # Use a descriptive ...
- 值得收藏的Python第三方库
网络站点爬取 爬取网络站点的库Scrapy – 一个快速高级的屏幕爬取及网页采集框架.cola – 一个分布式爬虫框架.Demiurge – 基于PyQuery 的爬虫微型框架.feedparser ...
- Python senium 中页面属性
1.通过id定位元素2.通过class_name定位元素3.通过tag_name定位元素4.通过name定位元素5.通过link文字精确定位元素6.通过link文字模糊定位元素7.通过CSS定位元素8 ...
- 深度剖析Kubernetes API Server三部曲 - part 3
在本系列的前两部分中我们介绍了API Server的总体流程,以及API对象如何存储到etcd中.在本文中我们将探讨如何扩展API资源. 在一开始的时候,扩展API资源的唯一方法是扩展相关API源代码 ...
- Http 与 Https区别
传统Http协议弊端 传统Http协议弊端是明文的,如果别人采用抓包分析可以获取到明文数据. 什么是Https协议 HTTPS(Hyper Text Transfer Protocol over Se ...
- 怎样理解数组的空元素empty与undefined的区别
数组的空元素empty表示空位, 它不是一种数据类型, 而是由于人为修改arr.length 或者写入时多写了逗号造成的. var arr = [1,2,3,4,,,5]; arr.length; a ...
- hdu 1203 转换的01包问题。。。。
俗话说的话 正难则反.,. 这个基本的思想都用不好的话 回家种田去吧. #include<cstdio> #include<string.h> #include<ios ...
- 十、es6之扩展运算符 三个点(...)
对象的扩展运算符 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中 let bar = { a: 1, b: 2 }; let baz = { ...bar }; / ...
- eclipse复制工作空间配置步骤
多个workspace,把每个workspace的设置共享,省去每次都重新配置一次. 总结一下,复制工作空间配置步骤如下: [最好是在新的workspace创建项目之前操作] 1 使用eclipse新 ...