Codeforces Round #344 (Div. 2) 631 C. Report (单调栈)
C. Report
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Each month Blake gets the report containing main economic indicators of the company "Blake Technologies". There are n commodities produced by the company. For each of them there is exactly one integer in the final report, that denotes corresponding revenue. Before the report gets to Blake, it passes through the hands of m managers. Each of them may reorder the elements in some order. Namely, the i-th manager either sorts first ri numbers in non-descending or non-ascending order and then passes the report to the manager i + 1, or directly to Blake (if this manager has number i = m).
Employees of the "Blake Technologies" are preparing the report right now. You know the initial sequence ai of length n and the description of each manager, that is value ri and his favourite order. You are asked to speed up the process and determine how the final report will look like.
Input
The first line of the input contains two integers n and m (1 ≤ n, m ≤ 200 000) — the number of commodities in the report and the number of managers, respectively.
The second line contains n integers ai (|ai| ≤ 109) — the initial report before it gets to the first manager.
Then follow m lines with the descriptions of the operations managers are going to perform. The i-th of these lines contains two integers ti and ri (, 1 ≤ ri ≤ n), meaning that the i-th manager sorts the first ri numbers either in the non-descending (if ti = 1) or non-ascending (if ti = 2) order.
Output
Print n integers — the final report, which will be passed to Blake by manager number m.
Examples
inputCopy
3 1
1 2 3
2 2
outputCopy
2 1 3
inputCopy
4 2
1 2 4 3
2 3
1 2
outputCopy
2 4 1 3
Note
In the first sample, the initial report looked like: 1 2 3. After the first manager the first two numbers were transposed: 2 1 3. The report got to Blake in this form.
In the second sample the original report was like this: 1 2 4 3. After the first manager the report changed to: 4 2 1 3. After the second manager the report changed to: 2 4 1 3. This report was handed over to Blake.
题意:
  给你一个长度为n的数组,和m个操作,一个操作有两种类型,1类型是将1到r的进行不下降排序,2类型是将1到r进行不上升排序。  
 思路:
  如果直接按照题目模拟时间复杂度是 O(mn log(n) ) 显然会TLE的,那么我们考虑优化。
我们知道,如果一个操作是op1,r1,而后面有一个操作 op2,r2, 当r2 >= r1的时候,前一个操作显然是无意义的。那么我们可以用一个严格递减的单调栈来维护有意义的操作,然后把能改变到的数字放到一个multiset里,我们按照r从大到小处理,每一次只处理和上一个r的差值区间即可,通过multiset可以访问一段数字中最大值和最小值来分类处理不同的操作。
细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n,m;
int a[maxn];
stack<pii> b;
multiset<int> s;
std::vector<pii> v;
int main()
{
    //freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);
    gbtb;
    cin>>n>>m;
    repd(i,1,n)
    {
        cin>>a[i];
    }
    int op,r;
    int q=0;
    repd(i,1,m)
    {
        cin>>op>>r;
        while(!b.empty()&&b.top().se<=r)
        {
            b.pop();
        }
        b.push(mp(op,r));
        q=max(q,r);
    }
    repd(i,1,q)
    {
        s.insert(a[i]);
    }
    v.push_back(mp(0,0));
    while(!b.empty())
    {
        v.push_back(b.top());
        b.pop();
    }
    int last=q;
    for(int j=sz(v)-2;j>=0;--j)
    {
        op=v[j+1].fi;
        for(int i=last;i>=v[j].se+1;i--)
        {
            if(op==1)
            {
                auto it=s.end();
                it--;
                a[i]=*it;
                s.erase(it);
            }else
            {
                a[i]=(*(s.begin()));
                s.erase(s.begin());
            }
        }
        last=v[j].se;
    }
    repd(i,1,n)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}
inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}
Codeforces Round #344 (Div. 2) 631 C. Report (单调栈)的更多相关文章
- Codeforces Round #541 (Div. 2) G dp + 思维 + 单调栈 or 链表 (连锁反应)
		https://codeforces.com/contest/1131/problem/G 题意 给你一排m个的骨牌(m<=1e7),每块之间相距1,每块高h[i],推倒代价c[i],假如\(a ... 
- Codeforces Round #344 (Div. 2) 631  B. Print Check (实现)
		B. Print Check time limit per test1 second memory limit per test256 megabytes inputstandard input ou ... 
- Codeforces Round #333 (Div. 1)--B. Lipshitz Sequence 单调栈
		题意:n个点, 坐标已知,其中横坐标为为1~n. 求区间[l, r] 的所有子区间内斜率最大值的和. 首先要知道,[l, r]区间内最大的斜率必然是相邻的两个点构成的. 然后问题就变成了求区间[l, ... 
- Codeforces Round #344 (Div. 2) C. Report 其他
		C. Report 题目连接: http://www.codeforces.com/contest/631/problem/C Description Each month Blake gets th ... 
- Codeforces Round #344 (Div. 2) C. Report
		Report 题意:给长度为n的序列,操作次数为m:n and m (1 ≤ n, m ≤ 200 000) ,操作分为t r,当t = 1时表示将[1,r]序列按非递减排序,t = 2时表示将序列[ ... 
- Codeforces Round #344 (Div. 2)  A. Interview
		//http://codeforces.com/contest/631/problem/Apackage codeforces344; import java.io.BufferedReader; i ... 
- Codeforces Round #344 (Div. 2) E. Product Sum 维护凸壳
		E. Product Sum 题目连接: http://www.codeforces.com/contest/631/problem/E Description Blake is the boss o ... 
- Codeforces Round #344 (Div. 2) D. Messenger kmp
		D. Messenger 题目连接: http://www.codeforces.com/contest/631/problem/D Description Each employee of the ... 
- Codeforces Round #344 (Div. 2) B. Print Check 水题
		B. Print Check 题目连接: http://www.codeforces.com/contest/631/problem/B Description Kris works in a lar ... 
随机推荐
- spring boot系列(二)spring boot web开发
			json 接口开发 在以前的spring 开发的时候需要我们提供json接口的时候需要做如下配置: 1 添加jackjson等jar包 2 配置spring controller扫描 3 对接的方法添 ... 
- three中的着色器示例
			其实在3D引擎/库的帮助下,我们做webgl开发的难度已经很大大地降低了,熟悉相关API的话,开发一个简单的3D程序可以说是很轻松的事情. 在我看来,webgl的核心就是着色器(顶点着色器.片元着色器 ... 
- java:工具(汉语转拼音,压缩包,EXCEL,JFrame窗口和文件选择器,SFTP上传下载,FTP工具类,SSH)
			1.汉语转拼音: import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuP ... 
- C# 函数返回多个值的方法
			有时候我们需要一个函数返回多个值,网上更多是用out实现,我个人很喜欢用tuple方法. tuple是一个元组,最多支持7个元素,再多需要嵌套等方法实现. 使用元组定义函数的方法如下: public ... 
- 3-2 LInux文件管理
			LInux文件管理 文件系统目录结构 Linux中目录结构是有一定的约定的FHS /bin:存放二进制程序 /boot:启动相关 /dev:设备文件 /etc:配置文件 /home:用户家目录 /li ... 
- php composer 开发自己的包
			以往都是在项目直接写自己的包文件,并没有把他放在packagist上面,以composer来管理使用. 今天没事来整一下,供大家一起学习 一,在github和packagist分别注册自己的账号,这里 ... 
- HCL试验八
			pc1:配置静态ip地址,掩码,网关 路由器R1:配置ip地址192.168.1.254 24;配置dhcp int gi 0/0 ip add 192.168.1.254 24 qu dhcp en ... 
- 【Python开发】Python:itertools模块
			Python:itertools模块 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器 ... 
- poj2385(基础DP)
			题目链接:http://poj.org/problem?id=2385 题意:最开始Bessie站在树1下面,每一个单位时间有颗苹果从树1或者树2上落下来.每个单位时间Bessie可以移动一次位置,时 ... 
- Job for jenkins.service failed because the control process exited with error code.
			root@xiakaibi-PC:~# service jenkins restartJob for jenkins.service failed because the control proces ... 
