BZOJ 4552 [Tjoi2016Heoi2016]排序 | 二分答案 线段树

题目链接

题面

题目描述

在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:
1:(0,l,r)表示将区间[l,r]的数字升序排序
2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字。

输入输出格式

输入格式:

输入数据的第一行为两个整数n和m。n表示序列的长度,m表示局部排序的次数。
1 <= n, m <= 10^5第二行为n个整数,表示1到n的一个全排列。接下来输入m行,每一行有三个整数op, l, r, op为0代表升序排序,op为1代表降序排序, l, r 表示排序的区间。
最后输入一个整数q,q表示排序完之后询问的位置, 1 <= q <= n。1 <= n <= 10^5,1 <= m <= 10^5

输出格式:

输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。

题解

这道题好有趣 = =
正解居然是二分答案!

因为最后要询问的只有一个位置,所以直接二分这个位置上的数。
然后修改一下原数组——原数组中比二分的答案大的数都改为1, 小于等于的都改为0。
然后用线段树模拟整个排序过程。把一个01序列的区间排序是很简单的——数出区间内有多少个1, 然后(如果是顺序排序)把右面对应的几个改成1, 剩下的改成0。
模拟执行一遍之后就可以知道实际上排完序后询问位置上的数应该比你二分的答案大还是小了,继续二分即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#define space putchar(' ')
#define enter putchar('\n')
typedef long long ll;
using namespace std;
template <class T>
void read(T &x){char c;bool op = 0;while(c = getchar(), c < '0' || c > '9')if(c == '-') op = 1;x = c - '0';while(c = getchar(), c >= '0' && c <= '9')x = x * 10 + c - '0';if(op) x = -x;
}
template <class T>
void write(T x){if(x < 0) putchar('-'), x = -x;if(x >= 10) write(x / 10);putchar('0' + x % 10);
}const int N = 100005;
int n, m, a[N], val[N], pos, op[N], ql[N], qr[N];
int data[4*N];
bool lazy[4*N], tag[4*N];void build(int k, int l, int r){tag[k] = 0;if(l == r) return (void)(data[k] = val[l]);int mid = (l + r) >> 1;build(k << 1, l, mid);build(k << 1 | 1, mid + 1, r);data[k] = data[k << 1] + data[k << 1 | 1];
}
void pushdown(int k, int l, int r){if(!tag[k]) return;int mid = (l + r) >> 1;data[k << 1] = lazy[k] * (mid - l + 1);data[k << 1 | 1] = lazy[k] * (r - mid);lazy[k << 1] = lazy[k << 1 | 1] = lazy[k];tag[k << 1] = tag[k << 1 | 1] = 1;tag[k] = 0;
}
void change(int k, int l, int r, int ql, int qr, int x){if(ql <= l && qr >= r) return (void)(data[k] = x * (r - l + 1), lazy[k] = x, tag[k] = 1);pushdown(k, l, r);int mid = (l + r) >> 1;if(ql <= mid) change(k << 1, l, mid, ql, qr, x);if(qr > mid) change(k << 1 | 1, mid + 1, r, ql, qr, x);data[k] = data[k << 1] + data[k << 1 | 1];
}
int query(int k, int l, int r, int ql, int qr){if(ql <= l && qr >= r) return data[k];pushdown(k, l, r);int mid = (l + r) >> 1, ret = 0;if(ql <= mid) ret += query(k << 1, l, mid, ql, qr);if(qr > mid) ret += query(k << 1 | 1, mid + 1, r, ql, qr);return ret;
}int main(){read(n), read(m);for(int i = 1; i <= n; i++) read(a[i]);for(int i = 1; i <= m; i++)read(op[i]), read(ql[i]), read(qr[i]);read(pos);int l = 1, r = n, mid;while(l < r){mid = (l + r) >> 1;for(int i = 1; i <= n; i++)val[i] = a[i] > mid;build(1, 1, n);for(int i = 1; i <= m; i++){int cnt = query(1, 1, n, ql[i], qr[i]);if(op[i]){if(cnt) change(1, 1, n, ql[i], ql[i] + cnt - 1, 1);if(ql[i] + cnt <= qr[i]) change(1, 1, n, ql[i] + cnt, qr[i], 0);}else{if(cnt) change(1, 1, n, qr[i] - cnt + 1, qr[i], 1);if(qr[i] - cnt >= ql[i]) change(1, 1, n, ql[i], qr[i] - cnt, 0);}}if(query(1, 1, n, pos, pos)) l = mid + 1;else r = mid;}write(l), enter;return 0;
}

转载于:https://www.cnblogs.com/RabbitHu/p/BZOJ4552.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python import 类 继承_python学习之类的继承

面向对象中一个重要的特性就是继承&#xff0c;继承的好处就是提高代码的重用率&#xff0c;减少不必要的代码。继承是父类与子类的关系&#xff0c;当子类继承了父类后&#xff0c;就具有了父类的所有变量和方法。在python中定义继承的语法是&#xff1a;class 派生类名(基类名…

Html5画布(canvas)实例之绘制矩形

路径方式绘制 - 矩形 | rect()canvas/shape/path/rect.html <!DOCTYPE HTML><html><head> <title>以路径的方式在 canvas 上绘制矩形的 demo</title></head><body> <canvas id"canvas" width"300" hei…

[patl1-046]整除光棍

解题关键&#xff1a;模拟除法 #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; char ans[10002]; int main(){int n;cin>…

使用AspectJ审计Spring MVC Webapp。 第2部分

现在&#xff0c;如果您有兴趣创建一个以Aspectj的Aspect和Before批注的形式使用面向方面编程&#xff08;AOP&#xff09;的Spring MVC Webapp来审核用户对屏幕的访问&#xff0c;那么这是您想要阅读的博客。 正如我在上一个博客中所说的那样&#xff0c;审核用户对屏幕的访问…

服装店管理系统打造门店拓客、促活、存留营销方案

打造门店拓客、促活和存留营销方案对于服装店的管理系统来说是非常重要的。以下是一些可行的方案&#xff1a; 1. 会员管理系统&#xff1a;引入会员管理功能&#xff0c;建立会员档案&#xff0c;跟踪会员消费记录和偏好。通过会员系统&#xff0c;可以实施积分制度、生日礼品…

mysql添加映射模块_iis7.5中让html与shtml一样支持include功能(添加模块映射)

刚开始弄得时候&#xff0c;发现了很多错误&#xff0c;其实很简单&#xff0c;参考shtm原来的设置就可以了前提条件&#xff1a;ServerSideIncludeModule的安装&#xff1a;在安装iis的时候选择上该服务(“在服务端包含文件”&#xff0c;选项)即可&#xff0c;如下&#xff1…

全局对象与临时转换

全局对象 ECMAScript 规定全局对象叫做 global&#xff0c;但是浏览器把 window 作为全局对象 这些全局变量分为两种&#xff1a; ECMAScript 规定的global.parseIntglobal.parseFloatglobal.Numberglobal.Stringglobal.Booleanglobal.Object 浏览器自己加的属性window.alertwi…

Html5开发-使用Canvas绘制图片

呈现图片 | drawImage()canvas/media/image.html <!DOCTYPE HTML><html><head> <title>在 canvas 上呈现图片的 demo</title></head><body> <canvas id"canvas" width"800" height"600" sty…

文件上传控件bootstrap-fileinput的使用

一、准备1、插件下载地址&#xff1a;https://github.com/kartik-v/bootstrap-fileinput/ 下载后的压缩包解压文件夹内容如下&#xff1a; js&#xff1a;插件核心js代码&#xff0c;引用fileinput.min.js/fileinput.js即可&#xff0c;默认插件语言为英文&#xff0c;如需要中…

在JPA 2.1中使用@Convert正确完成映射枚举

如果您曾经在JPA中使用过Java枚举&#xff0c;那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择&#xff0c;但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择&#xff1a; 托肖夫达林 Enumerated(EnumType.ORDINAL) &#xf…

python里orient_OrientDB Python连接操作

OrientDB Python连接操作Python的OrientDB驱动程序使用二进制协议。 PyOrient是git hub项目名称&#xff0c;它用于将OrientDB与Python连接起来并操作数据。 它适用于OrientDB 1.7及更高版本。以下命令用于安装PyOrient。pip install pyorient可以使用名为demo.py的脚本文件执行…

HTML5-画布(canvas)效果之-渐变色

<!DOCTYPE HTML><html><head> <title>渐变色</title></head><body> <canvas id"canvas" width"200" height"100" style"background-color: rgb(222, 222, 222)"> 您的浏…

ssh架构之hibernate(一)简单使用hibernate完成CRUD

1.Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)框架&#xff0c;它对JDBC进行了非常轻量级的对象封装&#xff0c;它将POJO与数据库表建立映射关系&#xff0c;是一个全自动的orm框架&#xff0c;hibernate可以自动生成SQL语句&#xff0c;自动执行&#xff0c…

使用AspectJ审计Spring MVC Webapp。 第1部分

如果您像我一样&#xff0c;那么您将拥有那种编程天&#xff0c;一切似乎都进展顺利。 您编写代码和测试&#xff0c;它就可以正常工作。 然后还有其他日子&#xff0c;非常糟糕的日子&#xff0c;在那儿&#xff0c;您知道所编写的所有内容都尽可能正确&#xff0c;并且代码拒…

GitHub注册和Git安装

一、注册GitHub GitHub官方地址&#xff1a;https://github.com。 在浏览器中打开GitHub网址&#xff0c;通过首页进行注册&#xff0c;如下图所示。 二、安装Git Git官方下载地址&#xff1a;http://git-scm.com/download/。 Git支持多平台&#xff08;Mac OS X/Windows/Linux…

django mysql迁移_关于django 数据库迁移(migrate)应该知道的一些事

命令首先数据库迁移的两大命令&#xff1a;python manage.py makemigrations & python manage.py migrate前者是将model层转为迁移文件migration&#xff0c;后者将新版本的迁移文件执行&#xff0c;更新数据库。这两中命令调用默认为全局&#xff0c;即对所有最新更改的mo…

如何存储和恢复 HTML5 Canvas 状态

当我们在 HTML5 Canvas 上使用其 2D 上下文进行图形绘制的时候&#xff0c;可以通过操作 2D 上下文的属性来绘制不同风格的图形&#xff0c;例如不同字体、填充等等。 通常情况下&#xff0c;在画布上的绘图时&#xff0c;您需要更改在绘制的2D背景下的状态。例如&#xff0c;你…

通过JNI使用C ++尖叫快速进行Lucene搜索

一天结束时&#xff0c;Lucene执行查询时&#xff0c;在初始设置后&#xff0c;真正的热点通常是相当基本的代码&#xff0c;它解码整数docID&#xff0c;术语频率和位置的顺序块&#xff0c;并对其进行匹配&#xff08;例如&#xff0c;对BooleanQuery并集或交集&#xff09;&…

“我们应当怎样做需求分析”——大纲卷

这是一篇关于怎么进行软件需求分析的文章&#xff0c;读完的第一个感觉就是累。真的是特别累&#xff0c;我大概估计了一下&#xff0c;得有40000个字。不过读完之后还是有一点收获的。下面是一个大概的内容。 一.需求调研阶段 初识1.在客户组织的第一场见面会上&#xff0c;保…

动态语言

这是动态语言和静态语言&#xff08;例如Java&#xff09;最大的差别之一。动态语言调用实例方法&#xff0c;不检查类型&#xff0c;只要方法存在&#xff0c;参数正确&#xff0c;就可以调用。 %d:输入输出中的格式控制,以整数的形式输入输出.%f:输入输出中的格式控制,以小数…