当前位置: 首页 > news >正文

[HEOI2016/TJOI2016] 排序 题解

[HEOI2016/TJOI2016] 排序 题解

很久没写过题解了,但这题思路十分新奇,震惊到我,并且让我学到了许多东西,故写篇题解纪念下。

洛谷题目传送门

题意

给定一个长度为 \(n\le 10^5\) 的序列。

\(m\le 10^5\) 次操作,每次给定一个区间,将区间内的数字排序,有升序降序两种。

问最后下标为 \(q\) 的数字的值。

思路

非常有意思,非常新奇。

01序列的排序

众所周知,对于一个长度为 \(n\) 的序列,排序的时间复杂度是 \(O(n\log n)\) 的。

但是对于一个 \(01\) 序列,甚至连 \(O(n)\) 都不需要,仅需个 \(O(\log n)\)

方法:

首先排序后的序列是有序的,必然是一段 \(0/1\) 连着第二段 \(0/1\)

那么就可以用线段树。

\(sum1\) 表示区间 \([l,r]\) 内的 \(1\) 的个数。

那么从大到小排序就是覆盖 \([l,l+sum1-1]\)\(1\)\([l+sum1,r]\)\(0\)

同理,从小到大就是覆盖 \([r-sum1+1,r]\)\(1\)\([l,r-sum1]\)\(0\)

然后我们就做到了针对 \(01\) 序列的 \(O(\log n)\) 排序。

题目转化

此时我们就尽量把原序列转化为 \(01\) 序列。

分析复杂度:

\(O(m\log n)\) 的操作是免不了的,剩下的最多再加上一只 \(\log\)

考虑二分答案。

将序列与我们二分出的 mid 进行比较,小于则变成 \(0\),否则是 \(1\)

那么我们 \(O(m\log n)\) 操作后,如果 \(q\) 位上是 \(1\),则代表 mid 小等于答案,否则大于。

二分判断的说明

其实如果我们在 \(m\) 次操作后再进行一次排序,可以发现答案的下标一定是在 \(0\) 段和 \(1\) 段的交汇点。

然而因为我们取 mid 时是按照大等于,所以答案的下标上的值一定是 \(1\)

然后我们就可以二分 check,总时间复杂度是 \(O(m\log^2n)\)

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ljl;
#define FUP(i,x,y) for(auto i=(x);i<=(y);++i)
#define FDW(i,x,y) for(auto i=(x);i>=(y);--i)
inline void Rd(auto &num);
const int N=1e5+5;
int n,m,a[N],q,t[N];
struct OPT{int op,l,r;
}opt[N];
namespace SMT{#define lc (p<<1)#define rc (p<<1|1)struct NODE{int l,r,sum,lz;}node[N*4];void pushup(int p){node[p].sum=node[lc].sum+node[rc].sum;return;}void bld(int l,int r,int p){node[p].l=l;node[p].r=r;node[p].lz=-1;if(l==r){node[p].sum=t[l];return;}int mid=(l+r)/2;bld(l,mid,lc);bld(mid+1,r,rc);pushup(p);return;}void pushdown(int p){if(node[p].lz==-1||node[p].l==node[p].r)return;node[lc].lz=node[p].lz;node[lc].sum=(node[lc].r-node[lc].l+1)*node[p].lz;node[rc].lz=node[p].lz;node[rc].sum=(node[rc].r-node[rc].l+1)*node[p].lz;node[p].lz=-1;return;}void addlr(int l,int r,int val,int p){if(l>r)return;pushdown(p);if(l<=node[p].l&&node[p].r<=r){node[p].lz=val;node[p].sum=(node[p].r-node[p].l+1)*val;return;}int mid=(node[p].l+node[p].r)/2;if(l<=mid)addlr(l,r,val,lc);if(mid<r)addlr(l,r,val,rc);pushup(p);return;}int query(int l,int r,int p){if(l>r)return 0;pushdown(p);if(l<=node[p].l&&node[p].r<=r)return node[p].sum;int mid=(node[p].l+node[p].r)/2,ans=0;if(l<=mid)ans+=query(l,r,lc);if(mid<r)ans+=query(l,r,rc);return ans;}
}
using namespace SMT;
bool check(int x)
{FUP(i,1,n)t[i]=(a[i]<x?0:1);bld(1,n,1);FUP(i,1,m){int l=opt[i].l,r=opt[i].r,op=opt[i].op;int sum1=query(l,r,1);if(op)//>{addlr(l,l+sum1-1,1,1);addlr(l+sum1,r,0,1);}else//<{addlr(r-sum1+1,r,1,1);addlr(l,r-sum1,0,1);}}return query(q,q,1);
}
int main(){Rd(n);Rd(m);FUP(i,1,n)Rd(a[i]);FUP(i,1,m){Rd(opt[i].op);Rd(opt[i].l);Rd(opt[i].r);}Rd(q);int l=1,r=n,mid,ans=0;/*遇到可能check(mid) ? l=mid的情况就用这种写法吧qwq */while(l<=r){mid=(l+r)/2;if(check(mid))ans=mid,l=mid+1;else r=mid-1;}printf("%d\n",ans);return 0;
}
inline void Rd(auto &num)
{num=0;char ch=getchar();bool f=0;while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9'){num=(num<<1)+(num<<3)+(ch-'0');ch=getchar();}if(f)num=-num;return;
}

总结

这题真的让我学到了好多,所以特此记录思想。

http://www.gsyq.cn/news/183481.html

相关文章:

  • 计算机Java毕设实战-基于Springboot的在线订餐系统设计与实现基于SpringBoot框架的线上订餐管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于SpringBoot的在线服装商城销售系统基于SpringBoot少数民族服饰在线销售系统的设计与实现【附源码、数据库、万字文档】
  • 实测10款降AI率工具:3个免费方法亲测有效!帮你免费降低AI率,论文降AIGC不再头疼!
  • 【课程设计/毕业设计】基于SpringBoot的订餐系统设计与实现基于SpringBoot框架的线上订餐管理系统的设计与实现【附源码、数据库、万字文档】
  • AI原生应用中对话状态跟踪的模型评估与选择
  • Java毕设选题推荐:基于SpringBoot的民宿管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于Spring Boot的网上订餐系统设计与实现基于SpringBoot框架的线上订餐管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • AI 不想取代播客主播,因为播客根本不赚钱|编码人声
  • 【论文精读(十七)】Point Transformer V3:点云序列化(Serialization)与FlashAttention的效率革命(CVPR 2024)
  • 近视防控,“抓早抓小”保护儿童远视储备
  • 某汽车厂AI物流仓储AGV调度系统:架构师详解多AGV协同与任务优先级调度算法
  • 【毕业设计】基于SpringBoot的民宿管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 基于微信小程序的食物识别系统
  • Java计算机毕设之基于SpringBoot少数民族服饰在线销售系统民族文化在线展示与传承的设计与实现完整前后端代码+说明文档+LW,调试定制等)
  • 基于SpringBoot + Vue的医院挂号预约管理系统
  • AI率成硬指标后,前五降AI工具更常用
  • Vim 编辑器介绍与使用指南
  • UDP-2-氨基-2-脱氧-D-葡萄糖二钠盐——糖基化研究与糖药物开发的核心核苷酸
  • 160_尚硅谷_string和slice
  • 1.2 多维数组(markdown版本)
  • 计算机Java毕设实战-基于SpringBoot+Vue的二手数码产品交易平台的开发与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 挠弹记录
  • UDP-2-F-D-葡萄糖胺二钠盐—糖生物学研究与药物开发的关键工具分子
  • 论文AI率超标自救:五佳降AI工具合集
  • 摸鱼没翻车,全靠这套 Chrome 快捷键组合
  • 102301338郭砚康的软件工程课程总结 - Nicholas
  • 高达一亿港币人工智能创投基金,亚洲人工智能初创大赛上海站招募丨社区伙伴活动推荐
  • 论文被判AI生成?五佳降AI工具避坑分享
  • 2025专科生必看!9大AI论文平台测评,写毕业论文还能这么快?
  • AI率怎么都降不下去?前五降AI工具真实体验