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

题解:[HEOI2016/TJOI2016] 排序

题目传送门

问题转化

发现询问有且仅有一次,且仅询问一个位置

因此无需得出整个序列,得出排序后的 \(a_q\) 即可。区间排序实在不好做,因此考虑能否找到一种方式转化。

答案与 \(a_q\) 正相关,其余其实并不重要。因此不妨有:

\[a_i\leftarrow \begin{cases} 1&a_i\geq a_q\\ 0&a_i<a_q \end{cases} \]

这样,排序即可视为区间赋值。

枚举答案 \(a_q=x\),可以 \(\mathcal O(m\log n)\) 维护区间赋值,若最后 \(a_q=1\),则说明 \(x\) 是可能的解,且真实的 \(a_q\geq x\)

因此可以二分。

时间复杂度 \(\mathcal O(m\log^2n)\)

AC 代码

只有一次查询,因此使用 ODT 实现。时间复杂度同线段树。

//#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
#include<set>
using namespace std;
constexpr const int N=1e5,M=1e5;
int n,m,q,backup[N+1],a[N+1];
struct operation{int op,l,r;
}op[M+1];
struct ODT{struct node{int l,r;mutable int value;};friend bool operator <(node a,node b){return a.l<b.l;}set<node>t;void build(int l,int r){t.insert({l,r+1});}void clear(){t.clear();}auto split(int x){auto p=t.lower_bound({x});if(p!=t.end()&&p->l==x){return p;}p=prev(p);int l=p->l,r=p->r,value=p->value;t.erase(p);t.insert({l,x-1,value});return t.insert({x,r,value}).first;}void assign(int l,int r,int value){auto pr=split(r+1),pl=split(l);t.erase(pl,pr);t.insert({l,r,value});}void ascending(int l,int r){auto pr=split(r+1),pl=split(l);int cnt=0;for(auto i=pl;i!=pr;i=next(i)){if(i->value){cnt+=i->r - i->l + 1;}}assign(l,r-cnt,0);assign(r-cnt+1,r,1);}void descending(int l,int r){auto pr=split(r+1),pl=split(l);int cnt=0;for(auto i=pl;i!=pr;i=next(i)){if(i->value){cnt+=i->r - i->l + 1;}}assign(l,l+cnt-1,1);assign(l+cnt,r,0);}int perform(int x){auto pr=split(x+1),pl=split(x);return pl->value;}
}t;
bool check(int mid){t.clear();t.build(1,n);for(int i=1;i<=n;i++){t.assign(i,i,a[i]>=mid);}for(int i=1;i<=m;i++){switch(op[i].op){case 0:t.ascending(op[i].l,op[i].r);break;case 1:t.descending(op[i].l,op[i].r);break;}}return t.perform(q);
}
int main(){/*freopen("test.in","r",stdin);freopen("test.out","w",stdout);*/ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=m;i++){cin>>op[i].op>>op[i].l>>op[i].r;}cin>>q;int l=0,r=n;while(l<r){int mid=l+r+1>>1;if(check(mid)){l=mid;}else{r=mid-1;}}cout<<l<<'\n';cout.flush();/*fclose(stdin);fclose(stdout);*/return 0;
}
http://www.sczhlp.com/news/14985/

相关文章:

  • 200行Python实现高效词性标注器
  • 2025 年 8 款超实用工作流项目管理软件,谁是你的菜?
  • if (a == 1 a == 2 a == 3) 为 true,你敢信???
  • 爱给网官网免费素材搜索引擎优化常用方法
  • 制作手机网站什么软件俄罗斯搜索引擎浏览器
  • 百度网站验证是学生个人网页制作教程
  • 社区居委会网站建设方案旺道营销软件
  • 做体育类网站素材怎么做百度网页推广
  • 百度爱采购官方网站快速排名点击工具
  • 网站建设一般的长宽seo是如何优化
  • 个人网站怎么推广seo编辑是干什么的
  • 企业年报网上申报入口免费官方seo查询友情链接
  • 如何用php数据库做网站下载百度导航app
  • 【EDK2】在UDK2018中实现兼容Vscode中的Edk2Code插件
  • 【攻防世界】hong
  • 可视化的做网站的app什么公司适合做seo优化
  • 上海做网站企业网站优化排名易下拉霸屏
  • 网站备案 座机口碑营销案例
  • 一级a做片性视频.网站在线观看泰安网站seo
  • 电子商务网站建设与管理B卷一键优化大师
  • ShareX丨全能屏幕工具的全新进化,高效截图与分享一步到位
  • vs 团队网站开发杭州优化seo
  • .NET Lock
  • 读书笔记:数据库日志问题解析:为什么我的数据库突然变慢了?
  • wordpress加上live2d惠州自动seo
  • 网站seo和sem是什么意思营销和销售的区别在哪里
  • 爱什么网站上门服务做嫁睫毛怎么建网站平台卖东西
  • 专业建站公司建站系统该规划哪些内容新乡seo推广
  • 盐城网站建设哪家好你就知道
  • 哪个网站能在家做兼职推广营销