正题

题目链接:https://www.luogu.com.cn/problem/AT4439


题目大意

给出1∼n1\sim n1∼n的排列aaa。求一个字典序最小的010101串sss满足将000对应位置按顺序取出成为序列AAA,剩下的成为序列BBB。

要求AAA和BBB的前缀最大值个数相同。

1≤n≤2×1051\leq n\leq 2\times 10^51≤n≤2×105


解题思路

首先对于前缀最大值来说,在排列aaa中的前缀最大值肯定在A/BA/BA/B中也是前缀最大值。

而假设我们序列AAA和BBB中都存在一个前缀最大值是在aaa中没有出现过的,那么显然这两个值前面比它大的值都在另一个序列中,所以我们交换这两个值时A/BA/BA/B的前缀最大值个数都减少了111。

所以如果存在一组解A/BA/BA/B中存在一个序列的所有前缀最大值都是aaa中原来的最大值。

那么接着考虑,假设我们做到一个状态:A/BA/BA/B中目前最大值个数为na/nbn_a/n_bna​/nb​,后面还有ccc个原来aaa序列中的最大值,BBB需要用kkk个,剩下ppp个都是新的最大值,那么如果有解就有等式
na+c−k=nb+k+p⇒na−nb+c=2k+pn_a+c-k=n_b+k+p\Rightarrow n_a-n_b+c=2k+pna​+c−k=nb​+k+p⇒na​−nb​+c=2k+p
而左边的式子是定值,所以我们只需要考虑右边式子的取值范围。

然后对于序列BBB,目前最后一个数是mbm_bmb​,设旧最大值数权为222,其他数的权值111。我们就需要考虑后面是否存在一个mbm_bmb​开始的上升序列的权值和为na−nb+cn_a-n_b+cna​−nb​+c。

而因为权值只有111和222,所以我们用数据结构维护一下奇偶的最大答案即可。

由于他要求字典序最小,我们无法确定AAA是全是旧的最大值还是BBB全是旧的最大值,所以我们两种情况都需要判断。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int n,s,a[N],od[N],ans[N],f[N][2];
struct SegTree{int w[N<<2];void Change(int x,int L,int R,int pos,int val){if(L==R){w[x]=val;return;}int mid=(L+R)>>1;if(pos<=mid)Change(x*2,L,mid,pos,val);else Change(x*2+1,mid+1,R,pos,val);w[x]=max(w[x*2],w[x*2+1]);}int Ask(int x,int L,int R,int l,int r){l=max(l,L);r=min(r,R);if(l>r)return w[0];if(L==l&&R==r)return w[x];int mid=(L+R)>>1;if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return max(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r));}
}T[2];
bool check(int p,int x){if(x<0)return 0;return T[x&1].Ask(1,1,n,p,n)>=x;
}
int main()
{scanf("%d",&n);int maxs=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]>maxs)od[i]=1,s++,maxs=a[i]; }memset(T[1].w,0xcf,sizeof(T[1].w));for(int i=n;i>=1;i--){int p=!od[i];for(int j=0;j<2;j++){f[i][j]=T[j^p].Ask(1,1,n,a[i]+1,n)+1+od[i];T[j].Change(1,1,n,a[i],f[i][j]);}}int A=0,B=0,ma=0,mb=0;for(int i=1;i<=n;i++){s-=od[i];T[0].Change(1,1,n,a[i],T[0].w[0]);T[1].Change(1,1,n,a[i],T[1].w[0]);if(check(max(ma,a[i]),B+s-A-(a[i]>ma))||check(mb,A+s-B+(a[i]>ma)))ans[i]=0,A+=(a[i]>ma),ma=max(ma,a[i]);else ans[i]=1,B+=(a[i]>mb),mb=max(mb,a[i]);}if(A!=B)return puts("-1")&0;for(int i=1;i<=n;i++)putchar(ans[i]+'0');return 0;
}

AT4439-[AGC028E]High Elements【结论,线段树】相关推荐

  1. 51nod1766-树上的最远点对【结论,线段树】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1766 题目大意 给出nnn个点的一棵树,mmm次询问给出两个区间,要求在 ...

  2. 中石油训练赛 - 小A盗墓(线段树+异或结论)

    题目链接:点击查看 题目大意:给出n个数,以及m个操作,每个操作分为两种: 1 x y:将第x个数变为y 2 x y:判断闭区间[x,y]中的数能否在进行升序排序后构成一段连续且上升序列 题目分析:因 ...

  3. 2018.3.15校内互测总结-点分治-线段树

    这是曾来过咱们学校集训的一位大神出的~ T1 题目大意 给出一棵带边权的无根树,求树上前$k$大的路径的长度. $1 \leq n \leq 200000$ 题解 想了一上午点分治,却发现只会$O(n ...

  4. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  5. 数据结构线段树介绍与笔试算法题-LeetCode 307. Range Sum Query - Mutable--Java解法

    此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 线段树(Segme ...

  6. 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)

    1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游 ...

  7. [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)

    题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...

  8. AtCoder AGC001F Wide Swap (线段树、拓扑排序)

    题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_f 题解: 先变成排列的逆,要求\(1\)的位置最小,其次\(2\)的位置最小,依次排下去( ...

  9. P3834 【模板】可持久化线段树 1(主席树)

    传送门 如标题,主席树模板 稍微介绍一下主席树.. 主席树是很多个线段树的结合体 利用了单点修改不会更新太多节点的结论(反正这一题是这样..),后一个线段树借用前面线段树的节点,而对于更新的节点才开一 ...

最新文章

  1. 使用vue的transition完成滑动过渡
  2. Win10操作系统不能访问共享文件夹
  3. #3771. Triple(生成函数 + 容斥)
  4. wordpress主题ajax,为自制WordPress主题/插件的后台设置页面添加ajax支持
  5. Linux开机启动过程(12):start_kernel()->还是setup_arch
  6. 狗换了新主人会想旧主人吗?
  7. 开源标准数据集 —— mnist(手写字符识别)
  8. 数学常用公式及规律、结论(一)
  9. 建立完善的日期定义表
  10. mathematica完爆matlab,Mathematica和Matlab相比的计算效率问题
  11. java 错误代码2503_错误代码:11300001 数据集配置错误
  12. 2022年南航计算机考研统考录取情况统计
  13. Python中国象棋源代码及素材
  14. Rust权威指南 读书笔记
  15. 出现 Unexpected token T in JSON at position 0 ,at JSON.parse (<anonymous>) 的解决方法
  16. OMPL库教程翻译/OMPL学习
  17. 手机号微信号绑定微信号_相关计算机,新手机号被绑定过微信号怎么办?这是个“二次”放号的号码...
  18. gulp4.0的坑:提示: Error: watching index.html: watch task has to be a function (optionally generated by u
  19. 电源设计中最常见的四种滤波电路原理及特点解析
  20. PHP MVC框架初探

热门文章

  1. ordersta在php中是什么意思,[求助]ststa中的几个问题
  2. 主机挂载存储_备战CKA每日一题——第3天 | 对接CSI存储知识
  3. 织梦首页html在哪儿,dedecms织梦首页去index.html
  4. java 代码同步_Java同步代码块 转
  5. 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...
  6. mysql表类型_MySQL表类型的选择
  7. 文件 单片机_如何查看你写的单片机程序有多大?
  8. 用计算机组成原理+唐朔飞的,计算机组成原理 唐朔飞 习题解答
  9. 通讯故障_掌握PLC必备知识,人机界面和 PLC 出现通讯故障如何分析解决
  10. [设计模式]迪米特法则