首页 > 其他分享 >Little Bird(单调队列优化的DP)

Little Bird(单调队列优化的DP)

时间:2024-08-22 23:15:53浏览次数:10  
标签:Little return int typedef long leq 正整数 Bird DP

题目描述
有一排\(n\)棵树,第\(i\)棵树的高度是\(d_i\)。有一只鸟要从第\(1\)棵树飞到第\(n\)棵树。

如果鸟降落在第\(i\)棵树,那么它下一步可以降落到第\(i+1,i+2,\dots,i+k\)棵树之中的一棵。

如果鸟降落到一棵不矮于当前树的树,那么它的劳累值会\(+1\),否则不会。

求劳累值的最小值。
输入
第一行一个正整数\(T(1\leq T\leq 2)\),表示测试数据的数量。

每组数据第一行一个正整数\(n(2\leq n\leq 10^6)\),表示树的数量。

第二行\(n\)个正整数\(d_1,d_2,\dots,d_n(1\leq d_i\leq 10^9)\),表示每棵树的高度。

第三行一个正整数\(q(1\leq q\leq 25)\),表示询问的数量。

接下来\(q\)行,每行一个正整数\(k(1\leq k\leq n-1)\),表示一个询问。
输出
每组数据输出\(q\)行,每行一个整数,即在给定的\(k\)下劳累值的最小值。
样例输入 Copy
1
9
4 6 3 6 3 7 2 6 5
2
2
5
样例输出 Copy
2
1

check函数若从lambda改为bool会超时,加inline可以过

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}
const int N = 1e6+10;
int q[N],d[N],f[N];
void solve()
{
	//先考虑二维dp,用f[i]表示从1飞到i的劳累值最小值
	//f[i] = min(f[j]+(d[j]<=d[i])) i-k<=j<=i-1
	//考虑对于j<k
	//若f[j]>f[k]的,k一定更优
	//若f[j]<f[k],则j更优
	//若f[j]==f[k],则d更高的优
	int n;
	cin>>n;
	for(int i=1;i<=n;++i) cin>>d[i];
	int Q;
	cin>>Q;
	while(Q--)
	{
		int k;
		cin>>k;
		//for(int i=1;i<=n;++i) cout<<d[i]<<" \n"[i==n];
		int h = 1,t = 0;
		auto check = [&](int j,int k)->bool
		{
			if(f[j] > f[k]) return true;
			else if(f[j] < f[k]) return false;
			else return d[k] >= d[j];
		};
		for(int i=1;i<=n;++i) 
		{	
			if(i >= k+1) while(h<=t&&q[h]<i-k) h++;
			if(i==1) f[i] = 0;
			else if(h<=t) 
			{
				//注意取的是队首
				f[i] = f[q[h]] + (d[q[h]]<=d[i]);
			} 
			//在本题中应该先计算f[i]后更新单调队列
			while(h<=t&&check(q[t],i)) t--;
			q[++t] = i;
		}
		cout<<f[n]<<'\n';
	}
	
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:Little,return,int,typedef,long,leq,正整数,Bird,DP
From: https://www.cnblogs.com/ruoye123456/p/18374935

相关文章

  • 计数DP
    闲话NFLS。话说AT计数dp好题挺多啊。[ABC248F]KeepConnect题解区已经讲得十分清楚了。套路地搞dp,将连通载入其中。\(dp_{i,j,0/1}\)表示前\(i\)列,断了\(j\)条边,上下是否连通的方案数。这里我们保证所有的点都与第\(i\)列其中的\(1\)或两个点相连。然后就可以转......
  • 网络通信(TCP+UDP通信)
    一、UDP协议 1.1、recvfrom()参数说明intsockfd,//socket的fdvoid*buf,//保存数据的一块空间的地址size_tlen,//这块空间的大小intflags,//0默认的接收方式-----阻塞方式默认行为是阻塞a.MSG_DONTWAIT不阻塞方式,用他的话代表读的时候是非阻塞方式b.类似......
  • C# start thread include Thread,Task,Async/Await,BackgroundWorker,ThreadPool,Time
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;using......
  • 预设型DP
    我们设\(f[i][j][k]\)表示填到\(i\)个数,目前拓展出\(j\)个可以填数的区间(最两边不算,注意是可以填数的区间!!),贡献和为\(k\)。这个是可以填数的区间我们按从小到大进行填数。那么对于任意一个数x显然有三种情况。1.如果x左右目前都没数,那么说明它的左右两个数都比x大,此......
  • 单调栈和单调队列优化DP
    单调栈和单调队列优化DPluoguP1725琪露诺一道比较板的题明显是一个DP,则有\[{dp}_i=\max_{j=i-r}^{i-l}dp_j+a_i\]如果暴力则为\(O(n^2)\)但是发现\(\max_{j=i-r}^{i-l}dp_j\)就是单调队列所解决的问题,所以直接单调队列维护即可#include<bits/stdc++.h>#defineFAS......
  • 131-横向移动-Kerberos攻击&SPN扫描&WinRM&WinRS&RDP
    1、RDP协议        RemoteDesktopProtocol远程桌面协议通常开放3389,Windows上面使用mstsc就可以弹出最常见的远程桌面连接方式,一般都是使用明文进行连接其实还可以使用hash进行        在内网中使用RDP协议一般是需要进行代理转发或者建立节点的端口扫......
  • 序列划分(区间DP)
    题目描述\(n\)个人,每个人手上有一个数\(a_i\)。将这些人分成若干组,组没有编号,要求每组人手上的数字之和都是质数。求合法的分组方案数。输入第一行一个正整数\(T(1\leqT\leq5)\),表示测试数据的组数。每组数据第一行一个正整数\(n(1\leqn\leq15)\)。每组数据第二行\(n\)......
  • [OI] 二项式期望 DP
    OSUOSUAnotherOSUyetAnotherOSUyetyetAnotherOSUOSU的题目是这样的:有一些相邻的块,给定每一个块的联通概率,每个连通块对答案有\(size^{3}\)的贡献,求总期望关于此题我曾写过题解此处此类题的关键之处在于,当我们设计了一个线性状态\(f_{i}\)之后,假如我们基于拼接......
  • Victor and World(状压DP)
    题目描述Aftertryinghardformanyyears,Victorhasfinallyreceivedapilotlicense.Tohaveacelebration,heintendstobuyhimselfanairplaneandflyaroundtheworld.Thereare\(n\)countriesontheearth,whicharenumberedfrom\(1\)to\(n\)......
  • 浅谈TCP和UDP协议的区别
    **传输模式**TCP协议:数据流(DataStream)--没有消息边界,比如服务端给客户端发来2048字节大小的数据,而客户端设置的一次最大接收大小为1024,这时候就意味着还有1024没能接收过来,要再接收一次。所以容易出现粘包的情况。所谓粘包,就是数据都粘在一起了。UDP协议:数据报(Da......