D2. Set To Max (Hard Version)
题解
具体想
遍历每一个
再换句话说就是维护一个单调队列,单调队列中的元素为
如果单调队列中含有元素
code
#include<bits/stdc++.h>
using namespace std;
int a[200005]={0},b[200005]={0},judge[200005]={0};
int n;
int solve1()
{
deque<int> q;
for(int i=1;i<=n;i++)
{
if(a[i]>b[i]) return 0;
while(q.size()&&q.back()<=a[i])q.pop_back();
q.push_back(a[i]);
while(q.size()&&q.front()>b[i]) q.pop_front();
if(q.size()&&q.front()==b[i]) judge[i]=1;
}
//for(int i=1;i<=n;i++) printf("%d:%d\n",i,judge[i]);
return 1;
}
int solve2()
{
deque<int> q;
for(int i=n;i>=1;i--)
{
if(a[i]>b[i]) return 0;
while(q.size()&&q.back()<=a[i])q.pop_back();
q.push_back(a[i]);
while(q.size()&&q.front()>b[i]) q.pop_front();
if(q.size()&&q.front()==b[i]) judge[i]=1;
}
//for(int i=1;i<=n;i++) printf("%d:%d\n",i,judge[i]);
return 1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
int flag=1;
if(!solve1()) flag=0;
if(!solve2()) flag=0;
int cnt=0;
for(int i=1;i<=n;i++)
{
cnt+=judge[i];
judge[i]=0;
}
if(cnt==n&&flag) puts("YES");
else puts("NO");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步