AT4439-[AGC028E]High Elements【结论,线段树】

正题

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


题目大意

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

要求AAABBB的前缀最大值个数相同。

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


解题思路

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

而假设我们序列AAABBB中都存在一个前缀最大值是在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+ck=nb+k+pnanb+c=2k+p
而左边的式子是定值,所以我们只需要考虑右边式子的取值范围。

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

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

由于他要求字典序最小,我们无法确定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;
}

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

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

相关文章

Docker最全教程——MongoDB容器化(十三)

上一节我们讲述了数据库容器化之持久保存数据&#xff0c;本节将讲诉MongoDB容器化实践&#xff0c;并且接下来将逐步讲解其他数据库&#xff08;MySql、Redis等等&#xff09;的容器化实践&#xff0c;然后将讲诉一些分布式架构的项目实践。由于实践需要花费大量的时间&#x…

一些数学小公式/定理的证明

文章目录定理①&#xff1a;类欧几里得算法公式①&#xff1a;等比数列求和②&#xff1a;等差数列一次方和③&#xff1a;等差数列二次方和结论①&#xff1a;n&11⇒3∣(2n−2)n\&11\Rightarrow 3|(2^n-2)n&11⇒3∣(2n−2)②&#xff1a;1222...n2n(n1)(2n1)61^22…

背包模型题目集合

文章目录背包模型01背包AcWing 423. 采药AcWing 1024. 装箱问题Luogu 2925 干草出售Proud Merchants完全背包P1616 疯狂的采药P1853 投资的最大效益Piggy-Bank多重背包Luogu P1776 宝物筛选HDU 1059 Dividing混合背包P1833 樱花二维费用背包问题P1507 NASA的食物计划HDU 2159 F…

CF1063F-String Journey【SAM,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/CF1063F 题目大意 给出一个字符串&#xff0c;求选出kkk个不交子串满足按照起始位置排序后&#xff0c;满足下一个是上一个的真子串。 求kkk的最大值。 1≤n≤51051\leq n\leq 5\times 10^51≤n≤5105 解题思路 首先我们肯…

CF1406D:Three Sequences(贪心、构造)

解析 本题说明了样例的重要性 完全可以通过仔细观察样例得出一些结论 首先最大值显然就是max⁡(b1,cn)\max(b_1,c_n)max(b1​,cn​) 考虑最优策略 如果a上升了&#xff0c;就让b上升 因为假设前面都拼的严丝合缝了&#xff0c;让c上升前面全得上升&#xff0c;肯定会对答案有…

在.NET Core中使用Exceptionless分布式日志收集框架

一.Exceptionless简介Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web Api&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;MVC 等技术栈的应用程序中&#xff0c;并且提供了…

YbtOJ-选点构形【欧拉函数】

正题 题目链接:https://www.ybtoj.com.cn/contest/351/problem/1 题目大意 一个圆上&#xff0c;你需要在3∼n3\sim n3∼n中选出kkk个作为aia_iai​&#xff0c;然后再圆上选择最少的点使得对于每个aia_iai​你都能用选出的点连成一个正aia_iai​边形。 k2≤n≤106k2\leq n\l…

CF1406E:Deleting Numbers(构造、根号分块)

解析 打表发现1e5以内的质因子是9592个 就是它没错了 容易想到枚举因子判断答案是否异常来判断是否包含该质因子 但是这个方法在最小质因子处是不奏效的 那么如何找到最小的质因子呢&#xff1f; 考虑把所有的质因子分成m\sqrt mm​块 然后每扫完一块&#xff0c;问一下 (A,…

test1 3-15 模拟赛1

文章目录考试复盘matrixsetstring考试复盘 首先先说T1T1T1&#xff0c;嗯&#xff0c;发现了列是相互独立的&#xff0c;所以分开考虑了 但是实在没想到线性基&#xff0c;就顺着自己的思路硬搞了505050跑路 老实说&#xff0c;505050分的部分分写得都是迷迷糊糊的&#xff0c;…

华为云提供针对Nuget包管理器的缓存加速服务测试

在Visual Studio 2013、2015、2017中&#xff0c;使用的是Nuget包管理器对第三方组件进行管理升级的。而且 Nuget 是我们使用.NET Core的一项基础设施&#xff0c;.NET的软件包管理器NuGet.org是一项面向全球用户搭建的服务&#xff0c;不论用户身在何处&#xff0c;NuGet.org都…

Consumer

Consumer 题意&#xff1a; n个游戏机&#xff0c;有w钱 每个游戏机上有游戏&#xff0c;每个游戏有价格和娱乐值&#xff0c;游戏机有价格&#xff0c;没有娱乐值&#xff0c;玩游戏必须要用对应的游戏机&#xff0c;问娱乐值最大是多少 题解&#xff1a; 有依赖关系的背包…

Loj#6405-「ICPC World Finals 2018」征服世界【模拟费用流,左偏树】

正题 题目链接:https://loj.ac/p/6405 题目大意 给出nnn个点的一棵树&#xff0c;每个点有xix_ixi​个军队&#xff0c;需要yiy_iyi​个军队&#xff0c;你可以移动军队&#xff0c;求使得满足所有点要求的情况下&#xff0c;军队移动路径和的最小值。 1≤n≤2500001\leq n\l…

兰道定理(竞赛图)

所谓兰道定理&#xff0c;就是兰道定下的道理 &#xff08;逃&#xff09; 解析 每条边被规定了方向的完全图叫做竞赛图 竞赛图中&#xff0c;设每个点的出度为uiu_iui​ 显然有&#xff1a; ∑uin(n−1)2\sum u_i\dfrac{n\times(n-1)}{2}∑ui​2n(n−1)​ 而兰道定理的内容是…

test2 3-16 2021 模拟赛two

文章目录考试复盘染色问题芬威克树礼物考试复盘 先说T1T1T1 染色&#xff0c;以为是道数学题&#xff0c;推了有一会儿的公式&#xff0c;从颜色1到颜色m&#xff0c;感觉是dpdpdp转移 发现颜色重叠的方案可以转化为另外一种相邻不重叠的染色 但是推到颜色4的时候就发现自己…

ASP.NET Core 2.2 : 扒一扒新的Endpoint路由方案

ASP.NET Core 从2.2版本开始&#xff0c;采用了一个新的名为Endpoint的路由方案&#xff0c;与原来的方案在使用上差别不大&#xff0c;但从内部运行方式上来说&#xff0c;差别还是很大的。上一篇ASP.NET Core;图解路由(2.1 earler)详细介绍了原版路由方案的运行机制&#xff…

郊区春游题解

郊区春游 题意&#xff1a; 给定一张图&#xff0c;求从某个起点出发&#xff0c;经过其中R个点&#xff08;R个点给出&#xff09;的最短路径&#xff08;每个点经过且只经过一遍&#xff09; 题解&#xff1a; 首先我们用floyed处理出任意两点的距离 dp[i][j]表示当前状态…

2021牛客暑期多校训练营3A-Guess and lies【dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11254/A 题目大意 现在有一个y∈[1,n]y\in[1,n]y∈[1,n]&#xff0c;BobBobBob每次可以选择问AliceAliceAlice是否y≥xy\geq xy≥x&#xff0c;AliceAliceAlice可以说一次谎。BobBobBob要在最少次数内确定yyy的值&#xf…

CF453C:Little Pony and Summer Sun Celebration(dfs、构造)

解析 比较巧妙的一道题 首先做一棵dfs生成树出来 尝试把它的欧拉序列作为答案 但是这样可能会有的地方不符合条件 如果x点的奇偶性不符合&#xff0c;就在序列中加入一个(x,fa) 同时改变x和fa的奇偶性 显然不会超过4*n 如果根需要改奇偶性怎么办&#xff1f; 最后一次回溯删掉…

开源中国 2018 新增开源软件最受欢迎 TOP 50

本周开源中国陆续公布了两个年度榜单&#xff0c;分别是国产新秀榜 TOP 30 和国产新增榜 TOP 50。由于两个榜单的数据来源都是国内开源项目&#xff0c;所以会有部分项目同时出现在两个榜单上。今天公布的这份榜单 —— 开源中国 2018 新增开源软件最受欢迎 TOP 50&#xff0c;…

简单环题解

简单环 题解: 题目求环的情况 如果我们直接枚举会有很多重复&#xff0c;为了避免重复&#xff0c;我们枚举起点&#xff0c;其他的点的序号都必须比起点大&#xff0c;也就是x->y&#xff0c;x一定小于y dp[i][j]表示的是以i的第一个点作为起点的链的数量&#xff0c;j是…