[CF1187D] Subarray Sorting
solution:
可以发现对区间 [l,r] 排序可以每次只排序 2 个然后冒泡,所以用 2 个和用多个是等价的。
假设现在 b1 到 bi−1 已经还原,现在考虑 bi 。
可以发现若存在 aj 可以与 bi 配对的条件是 min{a1,ai+1,,aj}=aj 时才可以配对,并且 a 的其余数相对位置保持不变,所以只要将配对的 a 赋为 INF 即可。
即只要维护一个单点修改,区间最值的线段树即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<vector> using namespace std; inline int read(){ int f=1,ans=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } const int MAXN=300001; int a[MAXN],b[MAXN],INF=INT_MAX; vector<int> ve[MAXN]; struct Segment{ int minn[MAXN<<2]; void clear(){memset(minn,127/3,sizeof(minn));} void cle(int k,int l,int r){ if(l==r){minn[k]=INF;return;} int mid=l+r>>1; cle(k<<1,l,mid),cle(k<<1|1,mid+1,r); minn[k]=min(minn[k<<1],minn[k<<1|1]); } void build(int k,int l,int r){ if(l==r){minn[k]=a[l];return;} int mid=l+r>>1; build(k<<1,l,mid),build(k<<1|1,mid+1,r); minn[k]=min(minn[k<<1],minn[k<<1|1]); return; } int Query(int k,int l,int r,int x,int y){ if(x<=l&&r<=y) return minn[k]; int mid=l+r>>1,res=INT_MAX; if(x<=mid) res=min(res,Query(k<<1,l,mid,x,y)); if(mid<y) res=min(res,Query(k<<1|1,mid+1,r,x,y)); return res; } void update(int k,int l,int r,int x,int y,int w){ if(x<=l&&r<=y){minn[k]=w;return;} int mid=l+r>>1,res=INT_MAX; if(x<=mid) update(k<<1,l,mid,x,y,w); if(mid<y) update(k<<1|1,mid+1,r,x,y,w); minn[k]=min(minn[k<<1],minn[k<<1|1]); return; } }segment; int T,n,M[MAXN]; int main(){ T=read(); segment.clear(); while(T--){ n=read(); for(int i=1;i<=n;i++) a[i]=read(),ve[a[i]].push_back(i); for(int i=1;i<=n;i++) b[i]=read(); bool f=1;segment.build(1,1,n); for(int i=1;i<=n;i++){ M[b[i]]++; if(ve[b[i]].size()<M[b[i]]){f=0;printf("NO\n");break;} if(segment.Query(1,1,n,1,ve[b[i]][M[b[i]]-1])!=b[i]){f=0;printf("NO\n");break;} segment.update(1,1,n,ve[b[i]][M[b[i]]-1],ve[b[i]][M[b[i]]-1],INF); }if(f) printf("YES\n"); for(int i=1;i<=n;i++) M[b[i]]=0,ve[a[i]].clear(); segment.cle(1,1,n); }return 0; }
分类:
数据结构 -- 线段树
, 其他 -- 思维
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析