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<bits/stdc++.h>
using namespace std;
int x[100005];
int y[100005];
deque<int> st;
int main(){
int t;
cin>>t;
while(t--){
while(!st.empty()) st.pop_back();
int n;
cin>>n;
for(int i=0;i<n;++i) cin>>x[i];
int u=0;
for(int i=0;i<n;++i){
cin>>y[i];
if(y[i]>x[i]) u=1;
}
if(u==1){
cout<<-1<<endl;
continue;
}
int s=0;
for(int i=0;i<n;++i){
while(!st.empty()&&st.front()>x[i]) st.pop_front();
while(!st.empty()&&st.back()<y[i]) st.pop_back();
if(x[i]==y[i]) continue;
if(!st.empty()&&st.back()==y[i]) ;
else s++;
st.push_back(y[i]);
}
cout<<s<<endl;
}
}