网站建设图片链接方法,阿里企业邮箱下载,WordPress主题虚拟资源,深圳市房地产信息系统平台luogu 传送门https://www.luogu.com.cn/problem/P3572
解题思路
先设 表示到 的最小劳累值。
很容易得出转移#xff1a; 其中 由 和 的大小关系决定#xff0c;并且 。
很显然#xff0c;直接暴力是 的#xff0c;会超时。 于是#xff0c;考虑优化。
我们发现…luogu 传送门https://www.luogu.com.cn/problem/P3572
解题思路
先设 表示到 的最小劳累值。
很容易得出转移 其中 由 和 的大小关系决定并且 。
很显然直接暴力是 的会超时。 于是考虑优化。
我们发现 是有一定的取值范围并且我们取的是这个区间内的最小值。
也许这可以用单调队列优化。
判断对头是否在范围内如果不在即出队
入队的时候考虑队尾的劳累值是否大于当前的劳累值如果大于则队尾出队如果队尾的劳累值等于当前的劳累值我们可以比较谁的高度更高保留更高的因为更高的对后面的情况更优。
于是时间复杂度降为 代码
#includebits/stdc.h
using namespace std;int n;
int d[1000001];
int qi;
int ki;
int f[1000001];
int q[1000001];
int head,tail;
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cinn;for(int i1;in;i){cind[i];}cinqi;while(qi--){cinki;head1,tail0;f[1]0;q[tail]1;for(int i2;in;i){while(headtailq[head]i-ki)head;if(d[i]d[q[head]])f[i]f[q[head]]1;elsef[i]f[q[head]];while(headtail(f[q[tail]]f[i]||(f[q[tail]]f[i]d[q[tail]]d[i])))tail--;q[tail]i;} coutf[n]endl;}return 0;
}