4552: [Tjoi2016&Heoi2016]排序

Time Limit: 60 Sec  Memory Limit: 256 MB
Submit: 579  Solved: 322
[Submit][Status][Discuss]

Description

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

Input

输入数据的第一行为两个整数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
 

Output

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

Sample Input

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3

Sample Output

5

HINT

 

Source

 

[Submit][Status][Discuss]

首先二分答案,然后需要知道进行m次排序后p位置上的数字是否大于mid。

对于一个mid,我们可以把序列里的数字分为两类,即大于mid的数和小于等于mid的数,分别用1和0表示。

对这些0和1进行排序时,对于一个区间[l,r]进行升序排序,等价于把所有的0放在前面,所有的1放在后面;降序排序反之。

用线段树支持区间求和及区间修改即可。

 #include <bits/stdc++.h>

 #define fread_siz 1024 

 inline int get_c(void)
{
static char buf[fread_siz];
static char *head = buf + fread_siz;
static char *tail = buf + fread_siz; if (head == tail)
fread(head = buf, , fread_siz, stdin); return *head++;
} inline int get_i(void)
{
register int ret = ;
register int neg = false;
register int bit = get_c(); for (; bit < ; bit = get_c())
if (bit == '-')neg ^= true; for (; bit > ; bit = get_c())
ret = ret * + bit - ; return neg ? -ret : ret;
} const int maxn = 1e5 + ; int n, m;
int total;
int num[maxn];
int map[maxn]; struct Query
{
int k, l, r;
}qry[maxn]; int pos; struct Node
{
int sum;
int tag;
int lt, rt;
}tree[maxn << ]; #define lson(t) (t << 1)
#define rson(r) (t << 1 | 1) void build(int t, int l, int r, int k)
{
tree[t].lt = l;
tree[t].rt = r;
tree[t].tag = -; if (l == r)
tree[t].sum = num[l] > k;
else
{
int mid = (l + r) >> ;
build(lson(t), l, mid, k);
build(rson(t), mid + , r, k);
tree[t].sum = tree[lson(t)].sum + tree[rson(t)].sum;
}
} void change(int t, int l, int r, int k)
{
if (l > r)return; if (l == tree[t].lt && r == tree[t].rt)
tree[t].sum = (r - l + ) * k, tree[t].tag = k;
else
{
int mid = (tree[t].lt + tree[t].rt) >> ; if (tree[t].tag != -)
{
change(lson(t), tree[t].lt, mid, tree[t].tag);
change(rson(t), mid + , tree[t].rt, tree[t].tag);
tree[t].tag = -;
} if (r <= mid)
change(lson(t), l, r, k);
else if (l > mid)
change(rson(t), l, r, k);
else
change(lson(t), l, mid, k), change(rson(t), mid + , r, k); tree[t].sum = tree[lson(t)].sum + tree[rson(t)].sum;
}
} int query(int t, int l, int r)
{
if (l == tree[t].lt && r == tree[t].rt)
return tree[t].sum; int mid = (tree[t].lt + tree[t].rt) >> ; if (tree[t].tag != -)
{
change(lson(t), tree[t].lt, mid, tree[t].tag);
change(rson(t), mid + , tree[t].rt, tree[t].tag);
tree[t].tag = -;
} if (r <= mid)
return query(lson(t), l, r);
else if (l > mid)
return query(rson(t), l, r);
else
return query(lson(t), l, mid) + query(rson(t), mid + , r);
} inline bool check(int mid)
{
build(, , n, mid); for (int i = ; i <= m; ++i)
{
int q = query(, qry[i].l, qry[i].r); if (qry[i].k)
{
change(, qry[i].l, qry[i].l + q - , );
change(, qry[i].l + q, qry[i].r, );
}
else
{
change(, qry[i].l, qry[i].r - q, );
change(, qry[i].r - q + , qry[i].r, );
}
} return query(, pos, pos);
} signed main(void)
{
n = get_i();
m = get_i(); for (int i = ; i <= n; ++i)
num[i] = get_i(); for (int i = ; i <= m; ++i)
{
qry[i].k = get_i();
qry[i].l = get_i();
qry[i].r = get_i();
} pos = get_i(); memcpy(map, num, sizeof(map));
std::sort(map + , map + + n);
total = std::unique(map + , map + + n) - map; int lt = , rt = total, mid, ans; while (lt <= rt)
{
if (check(mid = (lt + rt) >> ))
lt = mid + ;
else
rt = mid - , ans = mid;
} printf("%d\n", map[ans]);
}

@Author: YouSiki

BZOJ 4552: [Tjoi2016&Heoi2016]排序的更多相关文章

  1. bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...

  2. BZOJ 4552 [Tjoi2016&Heoi2016]排序 线段树的分裂和合并

    https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://blog.csdn.net/zawedx/article/details/5 ...

  3. bzoj 4552 [Tjoi2016&Heoi2016]排序——二分答案

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案,把 >= mid 的设成1.< mid 的设成0,之后排序就变成 ...

  4. BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树

    题目链接 题面 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  5. BZOJ 4552: [Tjoi2016&Heoi2016]排序 线段树 二分

    目录 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 update 10.6 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 /* //fang zhi ...

  6. bzoj 4552: [Tjoi2016&Heoi2016]排序——二分+线段树

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  7. bzoj 4552: [Tjoi2016&Heoi2016]排序【二分+线段树】

    二分值mid,然后把>=mid的赋值为1,其他赋值为0,每次排序就是算出区间内01的个数,然后分别把0和1放到连续的一段内,这些都可以用线段树来维护 二分的判断条件是操作完之后q位置上是否为1 ...

  8. BZOJ 4552 [Tjoi2016&Heoi2016]排序 ——线段树 二分答案

    听说是BC原题. 好题,二分答案变成01序列,就可以方便的用线段树维护了. 然后就是区间查询和覆盖了. #include <map> #include <cmath> #inc ...

  9. 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 链接 分析: 因为只询问一次,所以考虑二分这个数.显然是没有单调性的,但是我们可以二分所有大于等于mid的数中,是否有满足条件的x(而不 ...

随机推荐

  1. android 图片性能优化

    本章讲述在android开发中,图片处理方面的优化.包括知识点为大图加载,图片压缩,图片缓存处理及开源图片处理框架Universal-Image-Loader. 1.图片引发的内存不足 当在andro ...

  2. android 音乐播放器

    本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...

  3. 国外干货!6个方法助你设计出优秀的APP

    伟大的设计来源于一致性和细致化,而其实只要有足够的纪律,每个团队都可以实现这一点. 品牌(源码:http://www.jinhusns.com/Products/Download/?type=xcj) ...

  4. Mybatis基于注解的方式访问数据库

    1. 使用方式:在Service层直接调用 package com.disappearwind.service; import org.springframework.beans.factory.an ...

  5. jstl中格式化时间戳

    在jsp页面中使用jstl标签将long型的时间戳转换为格式化后的时间字符串 1.通过<jsp:useBean /> 导入java.util.Date类2.通过<jsp:setPro ...

  6. android 拔打电话功能

    private void phoneCall(String num) { String phoneNum = "tel:" + num; Uri smsToUri = Uri.pa ...

  7. 项目开发之UML之初识

  8. Markdown:让书写更美好

    http://www.jianshu.com/p/17fdcf17bbb4 http://sdutlinux.org/t/218   文档整体解决方案 在自己的服务器上安装GitBook markdo ...

  9. 数据结构(Java描述)之线性表

    基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...

  10. ANSI Common Lisp Practice - My Answers - Chatper - 2

    I work out the questions by myself Chapter 2 question 4. (defun greater (x y) (if (> x y) x y ) ) ...