【codechef】每次将l-r修剪成一样高度,求最少修剪几次

【codechef】每次将l-r修剪成一样高度,求最少修剪几次_第1张图片

Example Input


4
3
3 1 3
2 1 2
7
1 3 4 5 1 2 3
1 2 1 2 1 1 1
3
2 3 9
2 3 9
2
1 2
2 1

Example Output


2
3
0
-1

这题一看和涂色问题很像。但后来我发现两者是有区别的。涂色可以任意覆盖,而修剪只能越剪越短,不可能再变长。并且数据范围有10^5,肯定不是像涂色问题一样用区间dp。所以我后来用双端队列来维护可以沿用到当前这棵树的修剪高度,这个队列一定是递减(想想就知道了只能越剪越短啊)。要考虑的有点多,如果沿用修剪高度的话,原始高度一定要不小于修剪高度,最终高度必须保证不大于修剪高度。因此必须用双端队列而不能用栈。做法有点贪心的思想。

思考时间有点久。

#include
using namespace std;  
int x[100005];
int y[100005];
deque st;
int main(){
	int t;
	cin>>t;
	while(t--){
		while(!st.empty()) st.pop_back();
 		int n;
		cin>>n;
		for(int i=0;i>x[i];
		int u=0;
		for(int i=0;i>y[i];
			if(y[i]>x[i]) u=1;
		} 
		if(u==1){
			cout<<-1<x[i]) st.pop_front();
			while(!st.empty()&&st.back()

你可能感兴趣的:(稍难)