2019.01.20 bzoj5158 Alice&Bob(拓扑排序+贪心)
传送门
短代码简单题。
题意简述:对于一个序列XXX,定义其两个伴随序列a,ba,ba,b,aia_iai表示以第iii个数结尾的最长上升子序列长度,bib_ibi表示以第iii个数开头的最长下降子序列长度,现在给出aaa序列,问bbb序列所有数加起来最大值是多少。
思路:首先发现bbb序列就是把这个序列反过来之后得到的X′X'X′的aaa序列,因此贪心证明一波可以发现:对于这个需要自己构造的原序列是较大的数越靠前越好
然后可以根据aaa序列建一些有向边来表示各个位置的大小关系。
考虑证明如下两个性质:
- 如果∃a,b\exist a,b∃a,b满足a<b,Aa=Aba<b,A_a=A_ba<b,Aa=Ab,那么Xa≥XbX_a\ge X_bXa≥Xb,证明显然,如果不满足那么Ab≥Aa+1A_b\ge A_a+1Ab≥Aa+1
- 如果∃a\exist a∃a满足Aa!=1A_a!=1Aa!=1那么之前一定有至少一个At=Aa−1A_t=A_a-1At=Aa−1,考虑到性质1可以知道令离aaa最近的一个ttt使得Xt<XaX_t<X_aXt<Xa,而之前的都不一定是最优的。
现在已经很清楚如何建边了,我们对于每一个AAA值记一个preprepre数组表示前一个AAA出现的位置。
现在对于每个位置iii。
- preAipre_{A_i}preAi有意义,就从preAipre_{A_i}preAi向自己连一条有向边。
- preAi−1pre_{A_i-1}preAi−1有意义,就从自己向preAi−1pre_{A_i-1}preAi−1连一条有向边。
这样相当于连出来了一个模糊的关系图。
然后考虑让关系更加精确。
我们将这个图拓扑排序排出来最后的大小关系,那么由于较大的数越靠前越好所以我们用堆来维护这个出队顺序,强制让编号小的先出队即可。
然后考试的时候太慌统计答案的时候写错了丢了一个AK(摔
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1e5+5;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
ll ans=0;
vector<int>e[N];
int q[N],hd,tl,f[N],pre[N],du[N],n,tot=0,stk[N],mp[N];
priority_queue<int,vector<int>,greater<int> >S;
int main(){
memset(pre,-1,sizeof(pre)),n=read(),tot=n+1;
for(ri i=1,x;i<=n;++i){
x=read();
if(~pre[x])e[pre[x]].push_back(i),++du[i];
if(~pre[x-1])e[i].push_back(pre[x-1]),++du[pre[x-1]];
pre[x]=i;
}
for(ri i=1;i<=n;++i)if(!du[i])S.push(i);
while(!S.empty()){
int p=S.top();
f[p]=--tot,S.pop();
for(ri i=0,v;i<e[p].size();++i){
--du[v=e[p][i]];
if(!du[v])S.push(v);
}
}
reverse(f+1,f+n+1);
int len=0;
for(ri i=1,pos;i<=n;++i){
if(f[i]>mp[len])mp[++len]=f[i],pos=len;
else mp[pos=lower_bound(mp+1,mp+len+1,f[i])-mp]=f[i];
ans+=pos;
}
cout<<ans;
return 0;
}
2019.01.20 bzoj5158 Alice&Bob(拓扑排序+贪心)的更多相关文章
- [TJOI2014]Alice and Bob[拓扑排序+贪心]
题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果 ...
- BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...
- Luogu5284 十二省联考2019字符串问题(后缀树+拓扑排序)
对反串建SAM弄出后缀树,每个b串通过倍增定位其在后缀树上对应的节点,根据其长度将节点拆开.然后每个a串也找到对应的节点,由该节点向表示a串的节点连边,再把所给的边连上跑拓扑排序即可. #includ ...
- The Preliminary Contest for ICPC Asia Nanjing 2019 - D Robots(概率dp+拓扑排序)
这题概率dp + 拓扑排序可以写 改天补解释 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; ve ...
- POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)
题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...
- HDU 4857 逃生(反向建边的拓扑排序+贪心思想)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心
正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...
- BZOJ 2109 航空管制(拓扑排序+贪心)
绝世好题啊.. 题意:给出一个DAG,和每个点要求出现在这个DAG里面的拓扑排序的位置<=ti,求出所有可能的拓扑排序里面每个点出现的位置的最小值. 正着做不好做,考虑反着做,建立这个图的反图. ...
- bzoj4010: [HNOI2015]菜肴制作(拓扑排序+贪心+堆)
这题不是求最小字典序...撕烤了半个小时才发现不对劲T T 这题是能让小的尽量前就尽量前,无论字典序...比如1能在2前面就一定要在2前面... 显然是要先拓扑排序,让小的尽量前转化成让大的尽量往后丢 ...
随机推荐
- numpy学习之矩阵之旅
一:特殊的矩阵 1.全0全1的矩阵 2.单位矩阵 单位矩阵:整个矩阵是n*n的,并且斜对角全是1 矩阵的加减法 1.矩阵相加,相减必须要有相同的行和列 二:数组的乘法(点成) 数组的乘法 list_1 ...
- APIcloud制作APP 微信支付与支付宝支付
首先要在云端绑定相应模块如alipay和wxpay其次编写代码. 配置区域 var cfg = { webName:'',//APP名字 payDebug:true, isUseWxPay:true, ...
- 方法装饰器(Decorator)
代码: function enhance(target, key, descriptor) { const method = descriptor.value; let extraSpeed = 50 ...
- 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...
- mysql定时删除6个月前的表
查看定时是否开启: 查看event是否开启 : SHOW VARIABLES LIKE '%event_sche%'; 将事件计划开启 : ; 将事件计划关闭 : ; 代码: BEGIN -- 保存表 ...
- java 线程Thread 技术--线程状态与同步问题
线程技术第三篇: 线程的状态: 1. 创建状态: 当用new 操作符创建一个新的线程对象时,该线程就处于创建状态,系统不为它分配资源 2.可运行状态:当线程调用start 方法将为线程分配必须的系统资 ...
- linux命令学习之:systemctl
systemctl命令是系统服务管理器指令,主要负责控制systemd系统和服务管理器,它实际上将 service 和 chkconfig 这两个命令组合到一起. CentOS 7.x开始,CentO ...
- MySQL 中的数据类型介绍(转)
据我统计,MySQL支持39种(按可使用的类型字段统计,即同义词也作多个)数据类型.下面的介绍可能在非常古老的mysql版本中不适用. 转载出处:http://blog.csdn.net/anxpp/ ...
- c#一个统计运行时间方法
public string STD(int HowManySecond) { ) { "; } string ShowStr = ""; * )) { ShowStr + ...
- eigen Matrix详解
Eigen Matrix 详解 在Eigen中,所有的matrices 和vectors 都是模板类Matrix 的对象,Vectors 只是一种特殊的矩阵,行或者列为1. Matrix的前三个模板参 ...