升序区标记为1,降序区标记为0,用线段树进行区间维护,AC代码如下:
//2021省赛I题-双向排序(线段树)
#include <iostream>
#include <vector>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define _for(i,a,b) for(int i=(a);i<(b);i++)
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 100000+5;
vector<int> ans[2];
struct node{
int l,r; //该区间的左右端点
int sum; //该区间中1的个数
int lazy; //把该区间的值全部赋为lazy(0 or 1)
};
node node[maxn*4];
void push_up(int num){ //向上更新函数
node[num].sum=node[num<<1].sum+node[num<<1|1].sum;
}
void push_down(int num){ //下推懒惰标记
if(node[num].lazy==-1){
return;
}
int lazy=node[num].lazy;
node[num<<1].lazy=lazy;
node[num<<1].sum=(node[num<<1].r